directory
(directory pathspec)
pathspec に一致するパス名を string< でソートして返します。ホストがどの順でエントリを
返してこようと、同じプログラムはどのバックエンドでも同じ答えを表示します。一致するものが
なければ nil を返し、通知することはありません。
ワイルドな名前コンポーネントを含む場合はディレクトリを一覧し、パターンに一致した
ものを残します。* は任意個の文字、? はちょうど 1 文字にマッチします。返り値は
pathspec 自身のディレクトリ接頭辞を保つのでそのまま開くことができ、サブディレクトリには
末尾に / が付きます。
a.txt、b.txt とサブディレクトリ sub/、empty/ を含むディレクトリの場合:
| pathspec | 結果 |
|---|---|
"d/*.*" | (#P"d/a.txt" #P"d/b.txt" #P"d/empty/" #P"d/sub/") — すべて |
"d/*.txt" | (#P"d/a.txt" #P"d/b.txt") |
"d/?.txt" | (#P"d/a.txt" #P"d/b.txt") |
"d/*" | (#P"d/empty/" #P"d/sub/") — 名前がワイルドで型が無いので、型を持たないものだけ |
"d/a*" | NIL — 同じ規則。a.txt は型を持ちます |
ワイルドでない pathspec は自分自身を指します。これは Common Lisp と同じで、
"d/a.txt" はファイルが存在すれば (#P"d/a.txt") を返し、ディレクトリはディレクトリ形式の
自分自身を返します("d" も "d/" も (#P"d/"))。ディレクトリを一覧するのは
"d/*.*" であって "d/" ではありません。
ワイルドなディレクトリコンポーネントを含む場合は、名前を照合する前に接頭辞を
展開します。* はちょうど 1 階層、** はサブツリー全体を辿ります。Common Lisp と
同じく ** は 0 階層にも一致するので、起点ディレクトリ自身のファイルも返ります。
| pathspec | 結果 |
|---|---|
"d/*/*.lisp" | d/ の 1 階層下にある .lisp ファイル |
"d/**/*.lisp" | d/ とその下のどこかにあるすべての .lisp ファイル |
"d/**/" | d/ 自身と、その下のすべてのディレクトリ |
上記の結果はいずれも、同じツリーに対して SBCL が返すものと一致します。
バックエンドサポート
4 バックエンドすべてで、それぞれ 1 つのプリミティブを通して動きます。インタプリタは
ソースローダー抽象(ファイルシステムを持たないホスト、たとえばブラウザプレイグラウンドでは
失敗せずに nil を返します)、JVM は java.io.File.list、WASM は両モードとも WASI の
fd_readdir です。Preview 1 は実際のホスト関数に、--component は
wasi:filesystem の read-directory 上のアダプタに束縛されます。WASM モジュールは
パスはプリオープンされたディレクトリに対して解決されます。相対パスは最初の 1 つ、絶対パスは名前がそのパスの最長の接頭辞になるプリオープンディレクトリに対して解決されます。そのため --dir を付けて実行してください。
付けない場合は何にも一致しません。
. と ..(自身と親)のエントリは、どのバックエンドでも返りません。
このファミリーの残り(uiop:directory-files、uiop:subdirectories、
uiop:collect-sub*directories、uiop:directory-exists-p)は、すべてこの 1 つの関数で
定義されています。