gpt4 book ai didi

Clojure pre/post-walk 从根路径开始

转载 作者:行者123 更新时间:2023-12-04 21:08:12 26 4
gpt4 key购买 nike

我知道的

我熟悉 clojure.walk/prewalk 和 clojure.walk/postwalk

我想要的是

我想要像 clojure.walk/prewalk 和 clojure.walk/postwalk 这样的东西——但我也想要到达节点所需的路径——而 prewalk/postwalk 只给我节点,没有实际路径。

例子

所以如果我们有一个结构

[ {:cat "Garfield", :dog "DogeCoin"} [:a :b {:site "so"}]]

然后我想用 args 调用我的函数:
[] [ {: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))))

最佳答案

我想您还希望“pathwalk”从类似于 clojure.walk/prewalk 的函数 f 返回一些东西,而不是依赖副作用?例如。

(prewalk #(if (= :a %) :c %) [:a :b])
=>
[:c :b]

如果是,那么你可以这样做:
(defn pathwalk [f path e]
(let [e' (f path e)]
(cond
(map? e') (->> e'
(map (fn [[k x]] [k (pathwalk f (conj path k) x)]))
(into (empty e')))
(coll? e') (->> e'
(map-indexed (fn [i x] (pathwalk f (conj path i) x)))
(into (empty e')))
:else e')))

这是一个测试运行:
(pathwalk #(do
(println %1 %2)
(if (= :a %2)
:c
%2))
[]
[ {:cat "Garfield", :dog "DogeCoin"} [:a :b {:site "so"}]])

它会打印:
[] [{:cat Garfield, :dog DogeCoin} [:a :b {:site so}]]
[0] {:cat Garfield, :dog DogeCoin}
[0 :cat] Garfield
[0 :dog] DogeCoin
[1] [:a :b {:site so}]
[1 0] :a
[1 1] :b
[1 2] {:site so}
[1 2 :site] so

和以下数据将从函数返回:
[{:cat "Garfield", :dog "DogeCoin"} [:c :b {:site "so"}]]

关于Clojure pre/post-walk 从根路径开始,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40557159/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com