COMMON LISP JP > Archives > 2010/02/21

2010/02/21 08:30:24 UTCshiro
#
Common Lispで最近はまったところ: (rename-file #p"foo.tmp" #p"foo")
#
これがpathnameが好きになれない理由だなあ。抽象化の意図はわかるんだけど、現実のOSへマップするときのギャップがちょっと…
#
昔みたいにいろんなOSがあってパス名の指定もばらばらだった頃なら意味があったのかもしれないけど。
2010/02/21 08:44:08 UTCg000001
#
CLのパス名 周りは複雑ですよねー
2010/02/21 08:55:25 UTCg000001
#
可搬性を高める仕組みなのかもしれないですが
#
今となっては無駄に複雑な気もします
#
その割にはパス関係の問題で、UNIXで動くけれどWindowsでは動かないとか多いようなw
#
と書いていて数理システムさんがパス関係のことでまとめてたのを思い出しました
#
http://cl-www.msi.co.jp/solutions/knowledge/lisp-world/tutorial/cl-file-system.pdf
#
これを読んでもやっぱり複雑だなあと
2010/02/21 09:05:58 UTCshiro
#
それにも上のrename-fileの落とし穴は出てないね。
#
問題は、pathnameの仕様では「値が指定されない」ことと「値そのものがない (≠ 空文字列)」のが区別できないことにあるんじゃないかな。
#
ほんとは前者に:unspecificを使う意図だったのかもしれないけど、事実上どちらにもnilが使われちゃってる。
#
ちなみにAllegro CLでは "foo.tmp" -> "foo" へのリネームはこれでできた。
#
(rename-file "foo.tmp" #p(:name "foo" :type :unspecific))
#
でも:typeに:unspecificが使えるかどうかは処理系依存じゃないかなあ。
#
(それに、"foo" をパーズすると:type nilになるのと矛盾するよなあと思わないでもない)
2010/02/21 09:13:08 UTCg000001
#
なるほど処理系依存なんですね
2010/02/21 09:18:45 UTCg000001
#
(pathname-type "foo") ;=> :unspecific
#
でもOKなんでしょうか。:unspecificが返ってきた場合にnilにするという処理はみたことがありますが
#
それにしても処理系依存なんですねー
2010/02/21 09:32:20 UTCgaraemon
#
pathnameって他の言語ではどうするんだろう. やっぱ普通に文字列?
#
結局はdirname, basenameくらいがあれば十分なのだろうか
2010/02/21 09:34:19 UTCshiro
#
他に構造化している言語は見たことないですね。Rubyでそういうライブラリがあったような気もするけど。
#
dirname, basenameはわかりやすいんだけど、拡張子についてはファイル名の一部として扱いたい時と切り離して扱いたい時があって曖昧なので、CLの:typeみたいにきっちり分けちゃうとかえって不便なのかもしれない。
2010/02/21 09:36:52 UTCgaraemon
#
そもそもOSのファイル名と拡張子のあつかいが, 慣習的なものでしかない, ってのが問題なきがします. 拡張子なんてあってもなくてもいいわけですし
#
windowsはちがうか
2010/02/21 09:39:30 UTCshiro
#
そうですね。そういう曖昧なところは、きっちり仕様化するよりもなんとなくどっちでも解釈できるようにしといた方がよくて、文字列ってのは使う時に解釈すればいいからみんな使ってるって気はする。
#
だからpathnameオブジェクトがあっても、そういう曖昧さがあれば良かったのかなあ。CL的には曖昧な仕様って嫌かもしれないけれど。
#
CLISPだと (rename-file "foo.tmp" #p(:type :unspecified)) はエラーだった。:typeに:unspecifiedは指定できないそうな。
#
だとするとCLISPで"foo.tmp"を"foo"にリネームするのはどうするんだろう。
2010/02/21 10:07:56 UTCg000001
#
手元で試した感じでは、CLISP以外は、
#
いけるんですが、CLISPだと駄目なんですね
#
CLISPに処理系依存のUNIX-RENAMEのような関数があるかと思って探してみても
#
aproposで探す範囲では見当らないですね
2010/02/21 10:19:25 UTCgaraemon
#
ほんとだ, どうやるんだろう
2010/02/21 10:21:01 UTCg000001
#
mvコマンドを呼び出すということなのだろうか…
2010/02/21 10:21:19 UTCgaraemon
#
cl-fadとかはなんかやってないのかなあ