パスネーム可搬ライブラリCL-FAD

Cliki の current recommended libraries*1 のひとつである、パスネーム可搬ライブラリ、CL-FAD の説明を訳した。てきとー訳なので、間違っていたら許してほしい。ツッコミ歓迎。

元はこちら。http://weitz.de/cl-fad/

別の方の紹介。http://sakito.jp/cl/cl-fad.html

おおきな訳注:パスネーム、ディレクトリ形式、真の名前について

パスネームとは、CLにおいてファイルの名前を表すためのクラスであり、DIRECTORY, NAME, TYPE, DEVICE, HOST, VERSIONの6つのスロットを持つ。PATHNAME 関数を呼び出すことで、文字列からパスネームのインスタンスを作ることができる。

DIRECTORY にはファイルを含むディレクトリがリストで保存され、 NAME にはファイル名、 TYPE には拡張子、 HOST か DEVICE にはドライブレターが入る(Windowsの場合)。かつてバージョンを管理していたファイルシステムがあったため VERSION スロットが存在するが、今では滅多に使われない(らしい)。これにより、ファイルシステムに依存しない形でファイルのパスを表現できる。

シンボリックリンクの解決のようなファイルシステムレベルでの変換をすべて実行したパスネームを『真の名前』という。

ディレクトリには2つの表現方法がある。WindowsおよびUNIXシステムにおいて、ディレクトリは特殊なファイルでもあるので、もっとも内側のディレクトリの名前を NAME に入れることもできるし、NAME に何も入れずにすべて DIRECTORY スロットに入れることもできる。前者の形式をファイル形式と言い、後者の形式をディレクトリ形式という。これらが混在すると困ったことになる。

CL-FADでは、ファイル形式とディレクトリ形式を相互に変換し、またあるパスネームが指すディレクトリが存在するかどうかをテストする述語を提供することで、この問題を回避する。

ここから翻訳

Abstract

CL-FAD ( ファイルとディレクトリ "Files and Directories" のための ) は Common Lisp の標準のパスネーム関数の上の薄いレイヤである。これは、近年の Windows, OS X, Linux などのCL実装の間の統一を行うことを目的としている。

ほとんどのコードは Peter Seibel によって、彼の本である Practical Common Lisp (実践 Common Lisp) のために書かれた。*2

CL-FAD は BSD-style ライセンスと共に配布されているので、基本的に、あなたはこれを使って好きなことができる。

Contents
  1. Download and installation
  2. Supported Lisp implementations
  3. The CL-FAD dictionary
    1. directory-pathname-p
    2. pathname-as-directory
    3. pathname-as-file
    4. file-exists-p
    5. directory-exists-p
    6. list-directory
    7. walk-directory
    8. delete-directory-and-files
    9. copy-file
    10. copy-stream
  4. Acknowledgements
Download and installation

(訳注:省略されました。quicklispで入るよ)

Supported Lisp implementations

現在、次のCommon Lisp実装がサポートされている。

CL-FADを他のプラットフォームでも動作させられるパッチがあれば喜んで受け取る。


The CL-FAD dictionary

[Function] DIRECTORY-PATHNAME-P pathspec => generalized-boolean
pathspec(パスネーム指示子)がディレクトリ形式でないときは nil を返し、そうでなければ pathspec を返す。 pathspec が指しているファイルやディレクトリが本当に存在しているかは問題にしない。
[Function] PATHNAME-AS-DIRECTORY pathspec => pathname
ワイルドでないパスネーム指示子である pathspec をディレクトリ形式に変換する。すなわち、 DIRECTORY-PATHNAME-P が 真を返すようなパスネームを返す。
[Function] PATHNAME-AS-FILE pathspec => pathname
ワイルドでないパスネーム指示子 pathspec をファイル形式に変換する。すなわち、 DIRECTORY-PATHNAME-P が NIL を返すようなパスネームを返す。
[Function] FILE-EXISTS-P pathspec => generalized-boolean
パスネーム指示子 pathspec で名付けられるファイルが本当に存在しているのか試し、存在すれば真の名前を返し、さもなければ NIL を返す。真の名前は canonical なフォームで返される。すなわち、ディレクトリを指す真の名前は、 PATHNAME-AS-DIRECTORY を使ったかのようにtディレクトリフォームで返される。
[Function] DIRECTORY-EXISTS-P pathspec => generalized-boolean
パスネーム指示子 pathspec で名付けられるファイルが本当に存在しているのか、そしてそれがディレクトリであるかを試す。もしそうならば真の名前を返し、そうでなければ NIL を返す。真の名前は PATHNAME-AS-DIRECTORY を使ったようなディレクトリフォームで返される。
[Function] LIST-DIRECTORY dirname => list
ワイルドでないパスネーム dirname で示されるディレクトリに含まれるすべてのファイルに対応する真の名前のパスネームのリストを返す。サブディレクトリのパスネームはディレクトリフォームで返される。PATHNAME-AS-DIRECTORY を見よ。
[Function] WALK-DIRECTORY dirname fn &key directories if-does-not-exist test => |
関数指示子 fn によって示される関数を、ワイルドでないパスネーム指示子 dirname およびそのサブディレクトリに含まれるすべてのファイルに対して再帰的に適用する。fn は関数 test が真を返すファイルにだけ適用される(デフォルトでは test は常に真を返す関数である)。もし directories が NIL でなければ、 fn と test はディレクトリにも適用される。もし directories が :DEPTH-FIRST ならば、 fn はディレクトリの中身に対して最初に適用される。もし directories が :BREADTH-FIRST であり test が NIL を返す場合、ディレクトリの中身はスキップされる。if-does-not-exist は :ERROR あるいは :IGNORE でなければならない。デフォルトでは :ERROR であり、ディレクトリ dirname が存在しない時エラーを通知する。
[Function] DELETE-DIRECTORY-AND-FILES dirname &key if-does-not-exist => |
ワイルドでないパスネーム dirname で示されるディレクトリのファイル及びディレクトリを dirname そのものを含めて再帰的に消去する。 if-does-not-exist は、 :ERROR あるいは :IGNOREでなければならず、デフォルトである :ERROR は irname が存在しない時エラーを通知する。
[Function] COPY-FILE from to &key overwrite => |
ワイルドでないパスネーム指示子 from が示すファイルをワイルドでないパスネーム指示子 to が示すファイルへとコピーする。もし overwrite が真なら(デフォルトではNIL)、 to で示されるファイルが存在していても上書きする。
[Function] COPY-STREAM from to &optional checkp => |
from (ストリーム)から to (これもストリーム)へと from の終了にたどり着くまでコピーされる。どちらのストリームも bivalent でないかぎり同じ element type でなければならない。もし checkp が真ならば(これがデフォルト)、 element type が異なっているとき、エラーを通知する。

Acknowledgements

このライブラリのオリジナルのコードは Peter Seibel によって、彼の著書 Practical Common Lisp のために書かれた。私はこれにいくらか付け加え、 Windowsでも、具体的にはCCLで動くようにした。 OpenMCL, ECL, ABCL, MCL, and Scieneer CL で動くようにパッチを送ってくれた James Bielman, Maciek Pasternacki, Jack D. Unrue, Gary King, and Douglas Crosher に感謝する。