副作用优化了

时间:2015-06-28 07:06:15

标签: clojure

我是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 可以有副作用,以防止编译器优化它?

如果它是一个错误,我怎么能找到错误的位置?

1 个答案:

答案 0 :(得分:7)

map很懒。它并不意味着直接用于副作用,它只会在消耗时产生值。

您可以使用dorun强制实现这些值,即使您没有使用它们,或者使用doseq代替地图,doseq也可用于支持效果,与地图不同,不会花时间构建你永远无法访问的对象。