Clojure 副作用优化
我是新来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
(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比我预期的简单得多。我认为这在这里得到了很好的解释