2015-06-09 48 views
1

我最近发现了一种奇怪的球拍行为:无论何时我尝试过滤通过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>) 

回答

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是一个完整的路径,其结果也将完整路径。

+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? 
+0

结果是:Geiser REPL(在Emacs中)中的'()和球拍REPL中的目录列表(在我的shell中)。所以我会得出结论,我的问题是我的Emacs/Geiser设置的特定问题。不过,我使用Gentoo作为我的操作系统。 –

+0

我认为,我找到了解决我的问题的方法。我在脚本的某个地方使用了有问题的函数定义:''(define(.. path)...)''来获取路径的dirname(''..'')。在我将函数重命名为someWhatelse之后,Geiser REPL一直显示正确的输出。但是,谢谢你的回答。它真的帮了我,因为你让我意识到,我的问题根植于我的设置。祝你今天愉快! (+1) –