Common Lisp の file system interface

はじめに

最近、幾つかの Common Lisp 處理系を使つてみる機會があり、とても氣になつた事に、 まともな file system interface を持つ CL 處理系というものが驚くほど少ない。 というよりも、まともな file system interface を持つ處理系は、 私の見るところ Allegro CL だけで、 Lispworks はかろうじて許せる範圍だが、 SBCL と CCL は、とてもお話になりません。

以下 SBCL と Allegro CL を比較しながら、いくつか例を示します。

pathname-name, pathname-directory, pathname-type

pathname-namepathname-directory は、その名の通り pathname から name 部や directory 部を取り出すものです。 これらは pathname の指す實體は考えずに字面を見るだけの處理であり、 下記出力を例にとれば、 /tmp/etc/passwd という pathname が、 directory なのか file なのか、そもそも存在するのか、といつた事は一切關係しません。

CL-USER(93): (pathname-name "/tmp")
"tmp"
CL-USER(94): (pathname-name "/tmp/")
NIL
CL-USER(97): (pathname-directory "/tmp")
(:ABSOLUTE)
CL-USER(98): (pathname-directory "/tmp/")
(:ABSOLUTE "tmp")
CL-USER(103): (pathname-directory "/etc/passwd")
(:ABSOLUTE "etc")
CL-USER(104): (pathname-directory "/etc/passwd/")
(:ABSOLUTE "etc" "passwd")
CL-USER(105): (pathname-name "/etc/passwd")
"passwd"
CL-USER(106): (pathname-name "/etc/passwd/")
NIL

上は Allegro CL の出力例ですが、ここは SBCL も同じ結果を返します。 しかし、以下の例では Allegro CL と SBCL では出力が違つてきます。

CL-USER(95): (pathname-name ".")
NIL                ; Allegro
CL-USER(99): (pathname-directory ".")
(:RELATIVE)        ; Allegro
CL-USER> (pathname-name ".")
"."                ; SBCL
CL-USER> (pathname-directory ".")
NIL                ; SBCL

私にはどう見ても Allegro CL の方が理に叶つていると思えますが、いかがでしょうか。 SBCL の奇怪なのは、次の樣な例にも現れます。

CL-USER> (pathname-directory "././.")
(:RELATIVE "." ".")    ; SBCL
CL-USER> (pathname-name "././.")
"."                    ; SBCL

Allegro CL なら以下の樣に返してくれます。

CL-USER(101): (pathname-directory "././.")
(:RELATIVE)            ; Allegro
CL-USER(107): (pathname-name "././.")
NIL                    ; Allegro

同樣の事が pathname-type にも云えて、SBCL は、下記の樣な譯のわからない結果を返します。

CL-USER> (pathname-type "..")
""                    ; SBCL

そのくせ、以下の例では NIL が返ります。

CL-USER> (pathname-type ".")
NIL                   ; SBCL

Allegro CL では當然、どちらの場合も NIL が返ります。

CL-USER(108): (pathname-type ".")
NIL                    ; Allegro
CL-USER(109): (pathname-type "..")
NIL                    ; Allegro

probe-file

probe-file の動きも SBCL ではよくわかりません。

以下は、あたり前なのですが、

CL-USER> (probe-file "/etc/passwd")
#P"/etc/passwd"

以下はどうでしょう。わざわざ最期にスラッシュを入れてまで聞いたのは、 /etc/passwd/ という directory がありますか、といつた氣持ちがあるわけで、 Allegro CL に倣つて NIL と返すのが自然だと思います。

CL-USER> (probe-file "/etc/passwd/")
#P"/etc/passwd"    ; SBCL
CL-USER(112): (probe-file "/etc/passwd/")
NIL                ; Allegro

directory

directory の出力ついては考え方の違いと言つてしまえばそれまでですが、 私には Allegro CL の方がはるかに氣が利いていると思えます。

CL-USER(120): (directory "/tmp")
(#P"/tmp")          ; Allegro
CL-USER(121): (directory "/tmp/")
(#P"/tmp/babel-220244Xw"
 #P"/tmp/OSL_PIPE_1042_SingleOfficeIPC_d91c8be34fdb3d594a5f6d2583eec321"
 #P"/tmp/537184c64d42d" #P"/tmp/docview1042" #P"/tmp/.bamficonP2GGGX"
 #P"/tmp/537184b871e25" #P"/tmp/.X11-unix" #P"/tmp/.ICE-unix"
 #P"/tmp/unity_support_test.0" #P"/tmp/ssh-sx0FUOf7JJMU" ...)  ; Allegro
CL-USER> (directory "/tmp")
(#P"/tmp/")         ; SBCL
CL-USER> (directory "/tmp/")
(#P"/tmp/")         ; SBCL

文句ばかり言つていてもしかたがないので、 あまり參考になるとは思えませんが、 ものすごく汚い hack を github に置いておきました。

Author: 數理システム知識工學部

Date: 2014-05-26 18:04:31 JST

Generated by Org version 7.8.11 with Emacs version 24

© Mathematical Systems Inc. 2014