Clojure平顺序到树

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.

Fra*_*ila 6

拉链是一个很好的工具: 

(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)