(rontolisp) docs
← 関数

directory

(directory pathspec)

pathspec に一致するパス名を string< でソートして返します。ホストがどの順でエントリを 返してこようと、同じプログラムはどのバックエンドでも同じ答えを表示します。一致するものが なければ nil を返し、通知することはありません。

ワイルドな名前コンポーネントを含む場合はディレクトリを一覧し、パターンに一致した ものを残します。* は任意個の文字、? はちょうど 1 文字にマッチします。返り値は pathspec 自身のディレクトリ接頭辞を保つのでそのまま開くことができ、サブディレクトリには 末尾に / が付きます。

a.txtb.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 は実際のホスト関数に、--componentwasi:filesystemread-directory 上のアダプタに束縛されます。WASM モジュールは パスはプリオープンされたディレクトリに対して解決されます。相対パスは最初の 1 つ、絶対パスは名前がそのパスの最長の接頭辞になるプリオープンディレクトリに対して解決されます。そのため --dir を付けて実行してください。 付けない場合は何にも一致しません。

...(自身と親)のエントリは、どのバックエンドでも返りません。

このファミリーの残り(uiop:directory-filesuiop:subdirectoriesuiop:collect-sub*directoriesuiop:directory-exists-p)は、すべてこの 1 つの関数で 定義されています。