将树状列表转换为完整路径列表

时间:2017-11-01 10:00:57

标签: scheme guile

我想要使用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")

2 个答案:

答案 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")