cal*_*ter 2 tree clojure zipper
我有以下向量,[ - 1 1 2 -1 3 0 -1 2 -1 4 0 3 0 0]
代表树 [[1 2 [3] [2 [4] 3]]]
其中-1开始一个新分支,0结束它.如何将原始矢量转换为可用的树状clojure结构(嵌套矢量,嵌套映射)?我想clojure.zip/zipper可能会这样做,但我不确定如何构建这些函数args.
拉链是一个很好的工具:
(require '[clojure.zip :as zip])
(def in [-1 1 2 -1 3 0 -1 2 -1 4 0 3 0 0])
(def out [[1 2 [3] [2 [4] 3]]])
(defn deepen [steps]
(->> steps
(reduce (fn [loc step]
(case step
-1 (-> loc
(zip/append-child [])
(zip/down)
(zip/rightmost))
0 (zip/up loc)
(zip/append-child loc step)))
(zip/vector-zip []))
(zip/root)))
(assert (= (deepen in) out))
Run Code Online (Sandbox Code Playgroud)