Существует два основных способа указания путей:
Строки, очевидно, зависят от платформы: например, синтаксис Unix против синтаксиса Windows.
"/Users/foo/bar.text" is a valid pathname
"/Users/foo/*/foo.*" is a valid pathname with two wildcards
Вы можете создать объект pathname из строки:
? (pathname "/Users/bar/foo.text")
#P"/Users/bar/foo.text"
Приведенный выше #p гарантирует, что объект пути (а не строка) будет создан, когда вы прочитаете его обратно.
? #P"/Users/bar/foo.text"
#P"/Users/bar/foo.text"
Итак, Common Common Lisp внутренне работает с объектами имён путей, но он позволяет вам использовать обычные строки и при необходимости делает из них объекты имён.
Когда Common Lisp видит путь, в котором указаны не все компоненты (например, отсутствует каталог), он заполняет компоненты из объекта pathname, который является значением переменной * DEFAULT-PATHNAME-DEFAULTS *.
С помощью функции DESCRIBE вы можете просмотреть компоненты пути (здесь Clozure CL):
? (describe (pathname "/Users/bar/*.text"))
#P"/Users/bar/*.text"
Type: PATHNAME
Class: #<BUILT-IN-CLASS PATHNAME>
TYPE: (PATHNAME . #<CCL::CLASS-WRAPPER PATHNAME #x3000401D03BD>)
%PATHNAME-DIRECTORY: (:ABSOLUTE "Users" "bar")
%PATHNAME-NAME: :WILD
%PATHNAME-TYPE: "text"
%PHYSICAL-PATHNAME-VERSION: :NEWEST
%PHYSICAL-PATHNAME-DEVICE: NIL
- с использованием функций Lisp, создающих объекты pathname
MAKE-PATHNAME - это функция, для определения компонентов которой требуется несколько ключевых слов.
Иногда также полезно создать новое имя пути на основе существующего:
(make-pathname :name "foo" :defaults (pathname "/Users/bar/baz.text"))
Если вы используете DIRECTORY, полезно использовать путь с подстановочными знаками. DIRECTORY затем вернет список подходящих путей. Имя «DIRECTORY» немного вводит в заблуждение, поскольку DIRECTORY не перечисляет содержимое каталога, но перечисляет совпадающие пути для (обычно) пути с подстановочными знаками. Подстановочные знаки могут соответствовать последовательности символов в таких компонентах, как /foo/s*c/list*.l* ". Существует также подстановочный знак **, который используется для сопоставления с частями иерархии каталогов, например / foo / ** /test.lisp, который соответствует всем файлам test.lisp в каталоге foo и его подкаталогах.
(directory "/Users/foo/Lisp/**/*.lisp")
Выше должен возвращать список всех файлов 'lisp' в '/ Users / foo / Lisp /' и всех его подкаталогах.
Чтобы вернуть файлы .c в одном каталоге, используйте:
(directory "/Users/foo/c/src/*.c")
Обратите внимание, что DIRECTORY возвращает список объектов pathname (не список строк).
? (directory (make-pathname
:name "md5"
:type :wild
:directory '(:absolute "Lisp" "cl-http" "cl-http-342" "server")))
(#P"/Lisp/cl-http/cl-http-342/server/md5.lisp"
#P"/Lisp/cl-http/cl-http-342/server/md5.xfasl")
Выше используется объект пути, созданный MAKE-PATHNAME. Он возвращает все файлы, которые соответствуют /Lisp/cl-http/cl-http-342/server/md5.*.
Это то же самое, что и
(directory "/Lisp/cl-http/cl-http-342/server/md5.*")
, который короче, но зависит от синтаксиса Unix pathname.