пути в Common Lisp, имена файлов с подстановочными знаками в них

Символы * и ? используются в качестве подстановочных знаков в именах путей. Как можно обратиться к имени файла, в котором ? является одним из его фактических символов? Например: [18]> (wild-pathname-p #p"foo") NIL [19]> (wild-pathname-p #p"foo?") T Итак, ссылаясь на имя файла "foo?" нельзя делать таким образом. Я пытался экранировать ? обратной косой чертой, но это не сработало. Я пытался перейти на юникод, используя \u3f или \u003f, но это не сработало.

Как мне обратиться к файлу, который содержит подстановочный знак как часть своего имени: как его исследовать, открыть и т. д.?


person Mayer Goldberg    schedule 05.05.2015    source источник


Ответы (2)


Это зависит от реализации, но для некоторых обратная косая черта действительно работает. Но поскольку строки имен являются строками, чтобы получить строку с обратной косой чертой, вы должны экранировать обратную косую черту другой обратной косой чертой. Так, например, "foo?" экранируется как "foo\\?", а не "foo\?".

В прошлый раз, когда я проверял, в CLISP нет способа ссылаться на файлы с подстановочными знаками в именах. Мое решение — избегать CLISP.

person Xach    schedule 05.05.2015
comment
SBCL ведет себя так же, как CLISP, поэтому, по-видимому, общий стандарт lisp не включает механизма для экранирования подстановочных знаков, что странно. Что не менее странно, так это то, что cltl2, стр. 628 дает BNF для строк имен путей, и это не включает символ ?. Только * объявление ** - person Mayer Goldberg; 05.05.2015
comment
SBCL поддерживает экранирование с помощью обратной косой черты. - person Xach; 05.05.2015
comment
Подстановка в стиле Unix с * и ? внутри компонентов пути является нестандартным, но частым расширением пути и синтаксиса строки имени. - person Xach; 05.05.2015
comment
Вы имеете в виду что-то вроде: * (wild-pathname-p #p"foo?") T * (wild-pathname-p #p"foo\?") T * (wild-pathname-p #p"foo\\?") NIL - person Mayer Goldberg; 05.05.2015
comment
Вы можете обратиться к файлу с именем пути Unix foo? с #pfoo\\? в СБКЛ. - person Xach; 05.05.2015

На моем Mac под управлением Mac OS X 10.10.3: Clozure CL, SBCL и LispWorks напишите путь с * следующим образом:

#P"/private/tmp/test.\\*"

Однако они могут отличаться в некоторых других деталях.

person Rainer Joswig    schedule 06.05.2015
comment
(wild-pathname-p #ptest.\*) возвращает T в sbcl, но NIL в clisp. Кажется, проблема в этом: нет способа удалить особый статус подстановочных знаков в clisp. - person Mayer Goldberg; 07.05.2015