我想编写一个函数,给定一个可能嵌套的列表,它将返回每个叶子的索引列表,这样我就可以用 nth 和这些索引减少列表并获得每个叶子。例如:给定 lst = ((ab) c) 它会返回 ((0 0) (0 1) (1)) 因为 (reduce nth lst [0 0]) = a (reduce nth lst [0 1]) = b和 (减少第 n 个 lst [1]) = c。
编辑:这是我使用 clojure.zip 的解决方案。任何人都可以想出一个更优雅的吗?
(defn tree-indexes [zipper matcher pos accumulator]
(loop [loc zipper pos pos accumulator accumulator]
(if (z/end? loc)
accumulator
(if (matcher (z/node loc))
(if (z/right loc)
(recur (z/next loc) (update-in pos [(- (count pos) 1)] inc) (conj accumulator [(z/node loc) pos]))
(if (z/end? (z/next loc))
(recur (z/next loc) pos (conj accumulator [(z/node loc) pos]))
(recur (z/next loc) (update-in (vec (butlast pos)) [(- (count (vec (butlast pos))) 1)] inc) (conj accumulator [(z/node loc) pos]))))
(recur (z/next loc) (conj pos 0) accumulator)))))