2017-11-01 12 views
1

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

스택 오버 플로우에 오신 것을 환영합니다. 좀 더 구체적이어야합니다. 지금까지 뭐 해봤 어? 어디서 붙어 있니? [ask]를 읽고 질문을 수정하십시오. – Johan

답변

0

처럼 다음, 주어진리스트의 cdrcar을 반복은, 문자열 항목에 목록의 car을 추가하고, 다른 목록 요소에 자신을 호출하는 재귀 함수를 정의 반환 된 항목을 가져 와서 해당 목록의 car을 추가합니다. 코드에서 보이는 모습은 다음과 같습니다.

(define (tree->full-path-list tree) 
    (flatten (append (list (car tree)) 
        (map (lambda (x) 
          (if (list? x) 
           (map (lambda (y) 
            (string-append (car tree) "/" y)) 
            (tree->full-path-list x)) 
           (string-append (car tree) "/" x))) 
         (car (cdr tree)))))) 

희망 하시겠습니까?

+0

고마워, 정확히 내가 뭘 찾고 있었는지, 재귀상에서지도를 사용하지 못했다. – sciamano

+0

@sciamano! 사실, map-on-map에 대해서 말하자면, 나는 두 개의 매우 유사한'map'을 중첩 할 필요가없는 방법을 발견했을 것입니다. 사실, 이것을 제거 할 수있는 좋은 방법을 아는 사람이 있다면, 나는 알고 싶어합니다. –

+0

@ChristopherDumas 어쩌면'map'을 피할 수있는 제 대답을 살펴보아야 할 것 같습니다. – uselpa

0

나는 파티에 늦게 해요하지만이 사용, 허용 솔루션보다 훨씬 쉽게 (그리고 아마도 더 빠른) 방식으로 수행 할 수 있다고 생각 고전 명명하자

(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")