我是clojure的新手,在某个时刻我遇到了这个问题。
我的程序中有这样的代码:
(let [ ... ]
(map (fn [[v f]] (do-side-effect v f)) {:v1 f1, :v2 f2})
(do-the-job ...))
此do-side-effect
可以是println
等其他副作用函数intern
。问题是副作用不会发生。
但如果我将线路更改为
(println (map #(fn [[v f]] (do-side-effect v f)) {:v1 f1, :v2 f2}))
然后一切都好。
所以我想到的最后一个想法是clojure
只需优化map
因为
它认为它的结果是无用的,因为我没有使用它。
如果确实发生了这种情况,我该如何展示这种形式的clojure 可以有副作用,以防止编译器优化它?
如果它是一个错误,我怎么能找到错误的位置?
答案 0 :(得分:7)
map
很懒。它并不意味着直接用于副作用,它只会在消耗时产生值。
您可以使用dorun
强制实现这些值,即使您没有使用它们,或者使用doseq
代替地图,doseq
也可用于支持效果,与地图不同,不会花时间构建你永远无法访问的对象。