如何通过“directory-exists?”过滤目录列表?

时间:2015-06-09 20:24:37

标签: scheme racket

我最近发现了一个奇怪的球拍行为:每当我尝试过滤通过directory-list创建的目录列表时,我的REPL会返回一个空列表,但当我尝试使用quasiquoted列表时,我的REPL返回一个正确筛选列表。

我现在的问题是:为什么不可能通过directory-exists?过滤目录列表以及如何在球拍中列出目录

一些例子:

当我将directory-exists?filterdirectory-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>)

2 个答案:

答案 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是完整路径,则结果也将是完整路径。