Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Clojure从根路径进行预/后漫游 我所知道的_Clojure - Fatal编程技术网

Clojure从根路径进行预/后漫游 我所知道的

Clojure从根路径进行预/后漫游 我所知道的,clojure,Clojure,我熟悉clojure.walk/prewalk和clojure.walk/postwark 我想要什么 我想要clojure.walk/prewalk和clojure.walk/postwark之类的东西——但我也想要到达节点所需的路径——而prewalk/postwark只提供节点,而不提供实际路径 例子 所以如果我们有一个结构 [ {:cat "Garfield", :dog "DogeCoin"} [:a :b {:site "so"}]] 然后我想用args调用我的函数: [] [ {

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

我想要什么 我想要clojure.walk/prewalk和clojure.walk/postwark之类的东西——但我也想要到达节点所需的路径——而prewalk/postwark只提供节点,而不提供实际路径

例子 所以如果我们有一个结构

[ {: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建议)


我想您也希望“pathwalk”从函数f返回类似于clojure.walk/prewalk的内容,而不依赖于副作用?例如

(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"}]]

这是一个稍有不同的问题,但@fl00r可能会让你感兴趣:这很有用;我刚刚基于此编写了一个解决方案对于这个特定的例子,目标是副作用(即构建一个扁平的[[path value]]列表),但是是的,你是对的,一般来说,还应该支持纯f。谢谢
[{:cat "Garfield", :dog "DogeCoin"} [:c :b {:site "so"}]]