2017-08-15 7 views
1

最後の式は、代わりの空の子どもやClojureのジッパー

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

をretruns理由:

{: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)))))) 
問題が実際に関連付けられているように見えます

zip/nextをトラバースすると、2つのノードがあることがわかります。

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

なぜですか?空の子を持つ単一のノードが存在するので、正しいノードは1つだけにする必要があります。

答えて

2

clojure.zip/vector-zipのコードを見てから、私はノードの子供の不足がnilと通信されるべきだと結論づけます。空のシーケンスは機能しません。 したがって、children関数は実際には次のようになります。

(fn children [node] 
     (seq (:args node))) 
関連する問題