gpt4 book ai didi

clojure - 副作用优化掉

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

我是 Clojure 的新手,有时我遇到了这个问题。

我的程序中有这样的代码:

(let [ ... ]
(map (fn [[v f]] (do-side-effect v f)) {:v1 f1, :v2 f2})
(do-the-job ...))

这个do-side-effect 可以是例如intern 等另一个副作用函数的println。问题是不会发生副作用。

但是如果我把行改成

(println (map #(fn [[v f]] (do-side-effect v f)) {:v1 f1, :v2 f2}))

然后一切就OK了。所以我想到的最后一个想法是 clojure只需优化 map 因为它认为它的结果是无用的,因为我不使用它。

万一这真的发生了,我如何向 clojure 展示这种形式会产生副作用以防止编译器对其进行优化吗?

万一是bug,怎么才能找到bug在哪里呢?

最佳答案

map 是懒惰的。它并不意味着直接用于副作用,它只在它们被消耗时产生值。

你可以使用dorun强制实现值,即使你没有消费它们,或者使用doseq代替map,doseq 旨在用于副作用,与 map 不同,它不会花时间构建您永远不会访问的对象。

关于clojure - 副作用优化掉,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31097067/

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