【问题标题】:Empty children and Clojure zippers空孩子和 Clojure 拉链
【发布时间】:2017-08-15 13:53:49
【问题描述】:

为什么最后一个表达式会重新运行

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

代替:

{: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 []} 

这是为什么呢?有一个带有空子节点的节点,所以应该只有一个节点,对吗?

【问题讨论】:

    标签: clojure zipper


    【解决方案1】:

    看了 clojure.zip/vector-zip 的代码后,我得出的结论是缺少节点的孩子应该与nil 沟通。空序列不起作用。 所以children 函数应该是:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-04-10
      • 2018-02-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-31
      • 2013-02-07
      相关资源
      最近更新 更多