我知道的
我熟悉clojure.walk/prewalk和clojure.walk/postwalk。
我的需求
我需要类似于clojure.walk/prewalk和clojure.walk/postwalk的东西——但我还需要到达节点所需的路径,而prewalk/postwalk只提供了节点,没有实际路径。
示例
因此,如果我们有一个结构
[ {:cat "Garfield", :dog "DogeCoin"} [:a :b {:site "so"}]]
然后,我希望我的函数被调用并附带参数:
[] [ {:cat "Garfield", :dog "DogeCoin"} [:a :b {:site "so"}]]
[0] {:cat "Garfield", :dog "DogeCoin"}
[1] [:a :b {:site "so"}]
[0 :cat] "Garfield"
...
问题:
上面的问题是否有内置解决方案? 其中处理函数接收节点和从根节点到该节点的路径?
谢谢!
可能的解决方案
(基于fl00r的建议)
(defn pathwalk [f cur-path node]
(let [f1 #(pathwalk f (conj cur-path %1) %2)]
(f cur-path node)
(cond
(map? node) (map #(apply f1 %) node)
(or (vector? node) (list? node)) (keep-indexed f1 node))))