Clojure 副作用优化

Clojure 副作用优化,clojure,Clojure,我是新来clojure的,有时我会面临这个问题 我的程序中有这样的代码: (let [ ... ] (map (fn [[v f]] (do-side-effect v f)) {:v1 f1, :v2 f2}) (do-the-job ...)) 例如,这种do副作用可以是另一种副作用函数的println,如intern。问题是副作用不会发生 但是如果我把线路改成 (println (map #(fn [[v f]] (do-side-effect v f)) {:v1 f1

我是新来clojure的,有时我会面临这个问题

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

(let [ ... ]
    (map (fn [[v f]] (do-side-effect v f)) {:v1 f1, :v2 f2})
    (do-the-job ...))
例如,这种
do副作用可以是另一种副作用函数的
println
,如
intern
。问题是副作用不会发生

但是如果我把线路改成

(println (map #(fn [[v f]] (do-side-effect v f)) {:v1 f1, :v2 f2}))
那么一切都好了。 所以我最后想到的是clojure 只需优化
地图
,因为 它认为它的结果是无用的,因为我没有使用它

如果真的发生了这种情况,我如何向clojure证明 是否会产生副作用,阻止编译器对其进行优化


如果它是一个bug,我如何才能找到bug所在的位置?

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


您可以使用
dorun
强制实现这些值,即使您不使用它们,也可以使用
doseq
而不是map,
doseq
用于产生副作用,与map不同,map不会花费时间构建您永远无法访问的对象。

感谢您的快速回复!我忘记了map的懒惰,所以aswer比我预期的简单得多。我认为这在这里得到了很好的解释