gpt4 book ai didi

clojure - 为什么 clojure 交换!不能与 map 一起正常工作?

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

(defn get-vector []
(let [rs (atom [])]
(map (fn [x] (swap! rs conj x)) [1 2 3 4])
@rs))

(get-vector)

我认为这个函数应该返回[1 2 3 4];然而,它只返回一个空向量 []

最佳答案

Clojure map是懒惰的,因为你不要求它的结果,它不会评估它的内容,也不会用 swap! 执行你的函数。 .

要使其正常工作,您应该使用 dorun 强制它实现其内容:

(defn get-vector []
(let [rs (atom [])]
(dorun (map (fn [x] (swap! rs conj x)) [1 2 3 4]))
@rs))

(get-vector)
;; => [1 2 3 4]

我不确定您要解决什么问题 - 如果这只是测试 swap! 的示例代码比该代码看起来还好。否则你可能想使用其他解决方案,如 reduce并避免可变引用。

正如@Shlomi 所建议的那样,使用 doseq 会更加地道。副作用:

(let [rs (atom [])]
(doseq [x [1 2 3 4]]
(swap! rs conj x))
@rs)

关于clojure - 为什么 clojure 交换!不能与 map 一起正常工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36930260/

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