关于如何使用clojure.zip将孩子添加到树中的后续行动&#39 ;?

时间:2016-05-27 17:09:34

标签: clojure clojurescript

此问题涉及并且是问题37484870的后续行动:

考虑以下代码

(defn f [x]
    (loop [a x v [(inc x)]] 
      (if (> a 0) 
        (recur (dec a) (conj [a] v))
        v)))

(def v (z/vector-zip (f 10))

其中z指clojure.zip。请注意,10可能是一个更大的数字。

现在,我如何使用API​​中的函数为clojure.zip添加一个节点,以便结果等于

((def v (z/vector-zip (f (inc 10)) ? 

因此,节点将被添加到最深层的最左侧节点(如果有帮助的话)。

提出这个问题的原因是对问题37484870的回答 意味着一个10的循环

(z/down)
(z/right)

功能,但拉链结构可能提供更直接的解决方案。

1 个答案:

答案 0 :(得分:2)

可能的解决方案之一是

(-> v
    (#(let [next (z/next %)]
       (if (z/end? next)
         %
         (recur next))))
    (#(z/insert-right % [(inc (z/node %))]))
    (z/root))