我想要使用file-system-tree
函数
https://www.gnu.org/software/guile/manual/html_node/File-Tree-Walk.html#File-Tree-Walk。与链接中的remove-stat
组合,它产生树状列表结构,例如,对
test/
├── dir1
├── dir2
│ ├── file2
│ └── file3
└── file1
我们得到("test" (("dir2" ("file2" "file3")) "dir1" "file1"))
如何将该列表转换为所有完整路径的列表?像这样
("test/" "test/file1" "test/dir2" "test/dir2/file3" "test/dir2/file2" "test/dir1")
答案 0 :(得分:0)
我们需要做的是定义一个递归函数,该函数迭代给定列表的car
的{{1}},将列表的cdr
附加到字符串项,并调用它本身在另一个列表元素上,然后获取返回的项目并在列表中附加列表的car
。这是代码中的样子:
car
希望有所帮助!
答案 1 :(得分:0)
我迟到了派对,但我认为这可以通过比使用经典的名为let的公认解决方案更容易(也可能更快)的方式完成:
(define (path-append part1 part2)
;; concatenate paths (lazy man's version)
(if (non-empty-string? part1)
(string-append part1 "/" part2)
part2))
(define (f lst)
(reverse
(let loop ((lst lst) (path "") (res null))
(if (null? lst)
res
(let ((c (car lst)))
(loop (cdr lst)
path
(if (list? c)
(loop c (car res) res) ; this recurses into sub-lists
(cons (path-append path c) res))))))))
不完美,但很接近:
> (f '("test" (("dir2" ("file2" "file3")) "dir1" "file1")))
'("test" "test/dir2" "test/dir2/file2" "test/dir2/file3" "test/dir1" "test/file1")