clojure.zip
을 사용하여이 트리를 탐색하고 노드와 그 부모를 인쇄하십시오. 나는 부모를 얻는데 어려움을 겪고있다. 예를 들어, :e
의 부모는 :b
입니다. 모든 부모를 트리를 통해 걷는 것으로 찾으십시오.
;;
;; :a
;; /\
;; :b :c
;; /\ \
;; :d :e :f
;;
(def example [:a [:b [:d] [:e]] [:c [:f]]])
(def z (zip/vector-zip example))
(def locs (take-while (complement zip/end?) (iterate zip/next z)))
(defn parent-of [loc]
(when-let [parent-loc (-> loc zip/up zip/left)]
(zip/node parent-loc)))
(defn visit-all []
(doseq [loc locs]
(let [node (zip/node loc)]
(when (keyword? node)
(println node "has parent" (parent-of loc))))))
이
은 결과입니다:a has parent nil
:b has parent :a
:d has parent :b
:e has parent [:d]
:c has parent [:b [:d] [:e]]
:f has parent :c
나는 parent-of
기능을 지속적으로 개선 할 수 - 내 옆에 생각이 가장 왼쪽 노드로 이동하는 것입니다. 모든 위치에서 정답을 반환하는 알고리즘이 있습니다. 그러나이 방법은 일반적인 요구 사항에 대한 많은 작업처럼 보입니다.
제가 취해야 할 더 나은 방법이 있습니까?
편집 이 질문은 clojure.walk
또는 Spector
하지에 대한 것입니다. 난 clojure.zip
을 사용하여 질문에 정의 된대로 부모에게주는 대답을 찾고 있는데, 단순히 loc
위의 키워드입니다. 따라서 loc
이 parent-of
인 경우 :f
일 경우 :c
을 반환 할 것으로 예상됩니다.
지퍼가 실제로는 더 이상 사용되지 않는다고 말하면 clojure.walk
또는 Spector
이 나무를 탐색하기위한 현재 모범 사례 방법이라고 말하면 도움이 될 것입니다.
당신이 구현하고자하는 기능에 대한 샘플 입력과 출력을 제공 할 수 있습니까? – OlegTheCat
[Clojure - path with path]의 가능한 복제본 (http://stackoverflow.com/questions/33594375/clojure-walk-with-path) – nha