2014-12-18 6 views
-2

내가 목록 건물 재귀 함수있어 :Clojure (또는 임의의 함수 언어) : 재귀 함수를 사용하여 평면 목록을 작성하는 기능적인 방법이 있습니까?

(defn- traverse-dir 
    "Traverses the (source) directory, preorder" 
    [src-dir dst-root dst-step ffc!] 
    (let [{:keys [options]} *parsed-args* 
     uname (:unified-name options) 
     [dirs files] (list-dir-groomed (fs/list-dir src-dir)) 

을 ... 트래버스-DIR의 재귀 호출은 DIR-핸들러

(doall (concat (map-indexed (dir-handler) dirs) (map-indexed (file-handler) files))))) ;; traverse-dir 

목록의 마지막 식입니다 , traverse-dir에 의해 만들어지며, 플랫 한 것을 원하지만, 플랫 한 것을 원한다 :

flat-list (->> (flatten recursive-list) (partition 2) (map vec)) 

처음에는 평면 목록을 작성하는 방법이 있습니까? 변경 가능한 목록을 사용하지 않는 것, 즉.

+0

당신이 무엇을 요구하고 있는지 분명하지 않습니다. 'traverse-dir'은 아무것도 만들지 않습니다 ...'let' body에 아무것도 없기 때문에'nil '을 반환합니다. 'listdir-groomed','dir-handler','file-handler'가 무엇인지는 알려주지 않습니다. 제목을 암시하는 것처럼 목록을 병합하려는 경우 stackoverflow를 검색해보십시오. –

답변

1

내가 매우 아무것도이라고하며 인덱스 및 디렉토리 list-dir-groomed 그 모든 필요한 함수를 반환하는 dir-handler와 컨텍스트를 이해하지 않는,하지만 난 tree-seq 살펴 권하고 싶습니다 :

(defn tree-seq 
    "Returns a lazy sequence of the nodes in a tree, via a depth-first walk. 
    branch? must be a fn of one arg that returns true if passed a node 
    that can have children (but may not). children must be a fn of one 
    arg that returns a sequence of the children. Will only be called on 
    nodes for which branch? returns true. Root is the root node of the 
    tree." 
    {:added "1.0" 
    :static true} 
    [branch? children root] 
    (let [walk (fn walk [node] 
       (lazy-seq 
       (cons node 
        (when (branch? node) 
        (mapcat walk (children node))))))] 
    (walk root))) 

내 이동-하기 위해 여기에 사용이

(tree-seq #(.isDirectory %) #(.listFiles %) (clojure.java.io/as-file file-name)) 

입니다하지만 상황은 작동하지 않는 의미 할 수 있습니다. 위생 처리가 필요한 경우 하위 파일을 가져 오는 다른 함수로 변경하거나 출력에 filter을 사용할 수 있습니다. 그게 좋지 않다면 노드에서 로컬 fn과 같은 패턴이 반복적으로지도를 그려 아이들을 처리하는 사전 산책으로 적용될 수 있습니다.