gpt4 book ai didi

Clojure - 使用spectre转换嵌套数据结构,用多个节点替换一个节点

转载 作者:行者123 更新时间:2023-12-04 14:38:04 25 4
gpt4 key购买 nike

我正在使用 specter在 Clojure 中转换嵌套数据结构,但我还没有掌握它。特别是,我正在尝试创建一个转换,该转换将在任何深度找到与谓词匹配的项目,并将其替换为多个项目。

[:top
[:arbitrary 1 2
[:nesting
2
3
[:needle] ; <-- the thing to find
]]]

-->

[:top
[:arbitrary 1 2
[:nesting
2
3
[:n1] [:n2] [:n3] ; <-- 3 items inserted in the place of 1
]]]

我想不通的是如何将替换项拼接到父向量中,即如何将一项替换为三个项,而不是一项包含三个子项。

最佳答案

我不知道如何使用 Spectre 执行此操作,但这里有一个使用 clojure.zip 执行此操作的函数:

(defn splice-replace [zipper smap]
(loop [loc zipper]
(if (z/end? loc)
(z/root loc)
(recur
(z/next
(if-let [sub (smap (z/node loc))]
(reduce (comp z/right z/insert-right)
(z/replace loc (first sub))
(rest sub))
loc))))))

您可以使用数据结构的 zipper 和从要替换的值到要拼接到其位置的替换值序列的映射来调用它:
(def zipper
(z/vector-zip [:top
[:arbitrary 1 2
[:nesting 2 3 [:needle]]]]))

(splice-replace zipper {[:needle] [[:n1] [:n2] [:n3]]})
=> [:top [:arbitrary 1 2 [:nesting 2 3 [:n1] [:n2] [:n3]]]]

(splice-replace zipper {[:nesting 2 3 [:needle]] (range 3 10)})
=> [:top [:arbitrary 1 2 3 4 5 6 7 8 9]]

关于Clojure - 使用spectre转换嵌套数据结构,用多个节点替换一个节点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55173047/

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