我最近发现了一个奇怪的球拍行为:每当我尝试过滤通过directory-list
创建的目录列表时,我的REPL会返回一个空列表,但当我尝试使用quasiquoted列表时,我的REPL返回一个正确筛选列表。
我现在的问题是:为什么不可能通过directory-exists?
过滤目录列表以及如何在球拍中列出目录?
一些例子:
当我将directory-exists?
与filter
和directory-list
结合使用时,REPL每次都会返回一个空列表:
(filter directory-exists? (map path->complete-path
(directory-list (expand-user-path "~"))))
;; '()
现在,当我过滤一个quasiquoted列表时,如下例所示。 REPL返回一个正确的筛选列表,包含所有现有目录(没有虚构目录~/blablubb
)
(filter directory-exists?
(map path->complete-path `(,(path->complete-path (expand-user-path "~/documents"))
,(expand-user-path "~/blablubb" ))))
;; '(#<path:/home/niklas/documents>)
答案 0 :(得分:3)
FWIW运行您的代码段
(filter directory-exists?
(map path->complete-path
(directory-list (expand-user-path "~"))))
OS X上的给了我一个目录列表。
你显然已经看到了别的东西。
两个问题:
1. What is the result of:
(map path->complete-path
(directory-list (expand-user-path "~"))))
2. Which OS are you using?
答案 1 :(得分:1)
directory-list
默认返回相对路径,稍后会相对于(current-directory)
隐式解析,这可能与您传递给directory-list
的目录不同。
有点像这样:
~ $ ls dir
file1 subdir2
~ $ cat file1
cat: file1: No such file or directory
从当前目录开始,文件位于路径dir/file1
,而不仅仅是file1
。
一种解决方案是让directory-list
在返回的路径中包含目录:
(directory-list the-dir #:build? #t)
然后,如果the-dir
是完整路径,则结果也将是完整路径。