Jus*_*cle 23 lisp filesystems directory common-lisp
我在达尔文上使用OpenMCL,我想做的事情如下:
(loop for f in (directory "somedir")
collect (some-per-file-processing f))
Run Code Online (Sandbox Code Playgroud)
但我无法directory返回除了以外的任何东西NIL,我似乎无法在网上找到任何好的解释(除了"每个系统的不同").
有什么指针吗?
Rai*_*wig 27
基本上有两种指定路径名的方法:
字符串显然取决于平台:例如,Unix语法与Windows语法.
"/Users/foo/bar.text" is a valid pathname
"/Users/foo/*/foo.*" is a valid pathname with two wildcards
Run Code Online (Sandbox Code Playgroud)
您可以从字符串创建路径名对象:
? (pathname "/Users/bar/foo.text")
#P"/Users/bar/foo.text"
Run Code Online (Sandbox Code Playgroud)
上面的#p确保在您回读时创建路径名对象(而不是字符串).
? #P"/Users/bar/foo.text"
#P"/Users/bar/foo.text"
Run Code Online (Sandbox Code Playgroud)
因此,内部Common Lisp使用路径名对象,但它允许您使用普通字符串并根据需要从它们生成路径名对象.
当Common Lisp看到没有指定所有组件的路径名(例如缺少目录)时,它会填充路径名对象中的组件,该组件是variabel*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
Run Code Online (Sandbox Code Playgroud)
MAKE-PATHNAME是函数,它需要一些关键字参数来指定组件.
有时,基于现有路径名创建新路径名也很有用:
(make-pathname :name "foo" :defaults (pathname "/Users/bar/baz.text"))
Run Code Online (Sandbox Code Playgroud)
如果使用DIRECTORY,则使用带通配符的路径名很有用.然后,DIRECTORY将返回匹配路径名列表."DIRECTORY"这个名称有点误导,因为DIRECTORY没有列出目录的内容,但列出了(通常)带有通配符的路径名的匹配路径名.通配符可以匹配组件中的字符序列,如/foo/s*c/list*.l*".还有通配符**,用于匹配目录层次结构的部分,如/ foo/**/test.lisp,它匹配目录foo及其子目录下的所有文件test.lisp.
(directory "/Users/foo/Lisp/**/*.lisp")
Run Code Online (Sandbox Code Playgroud)
上面应该返回'/ Users/foo/Lisp /'及其所有子目录中所有'lisp'文件的列表.
要在单个目录中返回.c文件,请使用:
(directory "/Users/foo/c/src/*.c")
Run Code Online (Sandbox Code Playgroud)
请注意,DIRECTORY返回路径名对象列表(不是字符串列表).
? (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")
Run Code Online (Sandbox Code Playgroud)
Above使用MAKE-PATHNAME创建的路径名对象.它返回与/Lisp/cl-http/cl-http-342/server/md5.*匹配的所有文件.
这与:
(directory "/Lisp/cl-http/cl-http-342/server/md5.*")
Run Code Online (Sandbox Code Playgroud)
它更短,但取决于Unix路径名语法.
Dir*_*irk 19
您的路径名规范是否包含通配符?Common Lisp的路径名一开始有点难以理解 - 至少对我而言......正如CLHS在directory功能上陈述的那样:
如果pathspec不是wild,则结果列表将包含零个或一个元素.
为了让您的路径名包含通配符,您可以尝试使用make-pathname函数
(directory (make-pathname :directory '(:absolute "srv" "hunchentoot") :name :wild :type "lisp"))
Run Code Online (Sandbox Code Playgroud)
甚至
(directory (make-pathname :directory '(:absolute "srv" "hunchentoot") :name :wild :type :wild))
Run Code Online (Sandbox Code Playgroud)
我发现CL-FAD库对于处理路径名和文件系统很有帮助.特别是,它的list-directory功能可能比普通的标准directory功能更容易使用.
实现目录列表的现代Common Lisp库是IOLIB.
它的工作原理如下:
CL-USER> (iolib.os:list-directory "/etc/apt")
(#/p/"trusted.gpg~" #/p/"secring.gpg" #/p/"trustdb.gpg" #/p/"sources.list"
#/p/"sources.list~" #/p/"apt-file.conf" #/p/"apt.conf.d" #/p/"trusted.gpg"
#/p/"sources.list.d")
Run Code Online (Sandbox Code Playgroud)
请注意,不需要尾部斜杠或通配符.它非常强大,甚至可以使用错误编码的unicode字符处理文件名.
与CL-FAD相比的差异:
| 归档时间: |
|
| 查看次数: |
12239 次 |
| 最近记录: |