電動ひやむぎ

2014-08-05

SBCLの pathname

このエントリーをはてなブックマークに追加

SBCLの pathname云々でちょっと躓いたのでメモ.

;; 1. 普通  
(probe-file #p"/foo/bar/baz.txt")  
;=> T or NIL  
 
;; 2. "[]" を含む pathname  
(probe-file #p"/foo/[bar]/baz.txt")  
;=> Error  
 
;; 3. "[]" を含む pathnameの directory部を取得  
(pathname-directory #p"/foo/[bar]/baz.txt")  
;=> (:ABSOLUTE "foo" #<SB-IMPL::PATTERN (:CHARACTER-SET . "bar")>)  
 
;; 4. "[]" を含む pathnameを make-pathnameで作ってみる  
(make-pathname :directory '(:absolute "foo" "[bar]")  
               :name "baz"  
               :type "txt")  
;=> #P"/foo/\\[bar]/baz.txt"  
 
;; 5. 4で作った pathnameを probe-fileに与えてみる  
(probe-file (make-pathname :directory '(:absolute "foo" "[bar]")  
                           :name "baz"  
                           :type "txt"))  
;=> T or NIL  
 
;; 6. 4の戻り値と同じ表現の pathnameリテラルを probe-fileに食わせてみる  
(probe-file #P"/foo/\\[bar]/baz.txt")  
;=> Error  
 
;; 7. ついで  
(probe-file #P"/foo/bar/0/")  
;=> T  
(probe-file #P"/foo/bar/1/")  
;=> T  
(probe-file #P"/foo/bar/2/")  
;=> T  
(directory #P"/foo/bar/[0-2]/")  
;=> (#P"/foo/bar/0/" #P"/foo/bar/2/")  
 
(wild-pathname-p #p"/foo/[bar]/baz.txt")  
;=> T 

ずらずら書きましたが、SBCLでは pathname中の []は ワイルドカード扱い(内部の文字のどれかにマッチする)になるみたいですね。 * とか ? なんかも使えるみたいです。上記の6番に関しては、なんだか納得いかないのですが、そういうものなのでしょうか。

僕は スキャンした技術書なんかを "[著者名] 書籍名/書籍名.pdf" みたいなパスで保存していたりするのですが、そのファイルを probe-file しようとして上記の Errorになるやつを食らいました。知らないと困惑しそうな内容でございました。