gpt4 book ai didi

clojure - 无法取消关联矢量项?陷入循环

转载 作者:行者123 更新时间:2023-12-02 05:42:18 25 4
gpt4 key购买 nike

我正在编写一个循环,该循环根据向量中的字符串数据创建映射。在每次迭代中,我获取向量中的最后一项,从中构造一个键和一个值,将它们与 map 相关联,然后将刚刚记录到 map 的项目从向量中弹出。只要 vector 中仍有项目,这个过程就应该不断重复,直到 vector 为空且 map 已满。

函数内容如下:

(defn map-builder
"Transforms the vector of waterfalls into a map of waterfalls."
[input]
(loop [waterfall-db {}
vectorized-db input]
(let [key-str (last vectorized-db)]
key (->> key-str
(re-seq #"[0-9]+")
keyword)
val (subs key-str (+ 2 (.indexOf key-str ":"))))
(assoc waterfall-db key val)
(pop vectorized-db)
(if (> (count vectorized-db) 0)
(recur waterfall-db vectorized-db) waterfall-db)))

程序可以编译,但似乎在无限循环。我做了一个测试,使循环在一次迭代后退出,它返回了一个空 map (它应该有一个项目)。很明显,我没有正确地将项目与 map 相关联,这让我觉得我也必须不正确地取消项目与矢量的关联。不过,我看不出我哪里出错了——我是否对本地人的范围设定不当?

最佳答案

在 Clojure 中,数据结构不会就地改变:新的数据结构值是根据旧值计算得出的。

  • 在您的代码中,您执行 (pop vectorized-db) 的目的是弹出最后一个元素。 Clojure 的 pop 不是这样工作的,但会计算一个新向量,其元素与 vectorized-db 相同但最后一个。
  • 这同样适用于(assoc waterfal-db key val)

您需要做的是在 recur 调用中传递新值。代码(我没有测试过,因为我没有它应该做什么的例子)转换为:

(defn map-builder
"Transforms the vector of waterfalls into a map of waterfalls."
[input]
(loop [waterfall-db {}
vectorized-db input]
(if (empty? vectorized-db)
waterfall-db
(let [key-str (last vectorized-db)
key (->> key-str
(re-seq #"[0-9]+")
keyword)
val (subs key-str (+ 2 (.indexOf key-str ":")))]
(recur (assoc waterfall-db key val) (pop vectorized-db))))))

关于clojure - 无法取消关联矢量项?陷入循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23974241/

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