gpt4 book ai didi

lisp - 如何遍历 Common Lisp 中的目录?

转载 作者:太空宇宙 更新时间:2023-11-03 18:32:26 24 4
gpt4 key购买 nike

我在 Darwin 上使用 OpenMCL,我想做类似的事情:

(loop for f in (directory "somedir")
collect (some-per-file-processing f))

但我无法让 directory 返回除 NIL 以外的任何内容,而且我似乎无法在网上找到任何好的解释(除了“它与每个系统”)。

有什么建议吗?

最佳答案

基本上有两种指定路径名的方法:

  • 使用字符串

字符串显然取决于平台:例如 Unix 语法与 Windows 语法。

"/Users/foo/bar.text"  is a valid pathname
"/Users/foo/*/foo.*" is a valid pathname with two wildcards

您可以从字符串创建路径名对象:

? (pathname "/Users/bar/foo.text")
#P"/Users/bar/foo.text"

上面的 #p 确保在您读回时创建路径名对象(而不是字符串)。

? #P"/Users/bar/foo.text"
#P"/Users/bar/foo.text"

因此,Common Lisp 在内部使用路径名对象,但它允许您使用普通字符串并在需要时从中创建路径名对象。

当 Common Lisp 看到一个没有指定所有组件的路径名(例如目录丢失)时,它会从路径名对象中填充组件,该路径名对象是变量 *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 函数创建路径名对象

MAKE-PATHNAME 是函数,它需要几个关键字参数来指定组件。

有时基于现有路径名创建新路径名也很有用:

(make-pathname :name "foo" :defaults (pathname "/Users/bar/baz.text"))

如果您使用 DIRECTORY,使用带通配符的路径名会很有用。DIRECTORY 将返回匹配路径名的列表。名称“DIRECTORY”有点误导,因为 DIRECTORY 不列出目录的内容,而是列出(通常)带有通配符的路径名的匹配路径名。通配符可以匹配/foo/s*c/list*.l* 等组件中的字符序列。还有通配符 ** ,用于匹配目录层次结构的一部分,如/foo/**/test.lisp ,匹配目录 foo 及其子目录下的所有文件 test.lisp。

(directory "/Users/foo/Lisp/**/*.lisp")

上面应该返回“/Users/foo/Lisp/”及其所有子目录中所有“lisp”文件的列表。

要返回单个目录中的 .c 文件,请使用:

(directory "/Users/foo/c/src/*.c")

请注意,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")

上面使用了由 MAKE-PATHNAME 创建的路径名对象。它返回匹配/Lisp/cl-http/cl-http-342/server/md5.* 的所有文件。

这等同于:

(directory "/Lisp/cl-http/cl-http-342/server/md5.*")

哪个更短,但取决于 Unix 路径名语法。

关于lisp - 如何遍历 Common Lisp 中的目录?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1403717/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com