2017-08-15 2 views
1

Warum der letzte Ausdruck RetrunsLeeren Kinder und Clojure Reißverschluss

{:a :foo, :args [{:id :XX}], :id :XX}

statt:

{:a :foo, :args [], :id :XX}

(require '[clojure.zip :as zip]) 

(defn my-zipper [tree] 
    (zip/zipper 
    (fn branch? [node] 
     (:args node)) 
    (fn children [node] 
     (:args node)) 
    (fn make-node [node children] 
     (assoc node :args (vec children))) 
    tree)) 

(def z (my-zipper {:a :foo :args []})) 

(loop [loc z] 
    (if (zip/end? loc) 
    (zip/node loc) 
    (recur 
     (zip/next 
     (zip/edit loC#(assoc % :id :XX)))))) 

Es sieht aus wie das Problem mit der Tatsache verbunden ist, Das Traversieren mit zip/next zeigt 2 Knoten:

(zip/node (zip/next z))    ; => nil 
(zip/node (zip/next (zip/next z))) ; => {:a :foo :args []} 

Warum ist das? Es gibt einen einzelnen Knoten mit leeren Kindern, also sollte es nur einen Knoten geben, richtig?

Antwort

2

Nach dem Blick auf den Code von clojure.zip/vector-zip schließe ich, dass der Mangel an Knoten Kindern mit kommuniziert werden sollte. Die leere Sequenz funktioniert nicht. So sollte die children Funktion wirklich sein:

(fn children [node] 
     (seq (:args node))) 
Verwandte Themen