副作用优化了

Jus*_*ous 2 clojure

我是clojure的新手,在某个时刻我遇到了问题.

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

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

do-side-effect例如,这可以是println另一种副作用功能intern.问题是副作用不会发生.

但是,如果我改变行

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

一切都好.所以我最后的想法是,clojure只是优化了map因为它认为它的结果是无用的,因为我不使用它.

如果实际发生这种情况,我怎么能显示这种形式可以产生副作用以阻止编译器优化它?

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

noi*_*ith 7

map很懒.它不是直接用于副作用,它只在消耗时产生值.

您可以使用dorun强制值来实现,即使您没有使用它们,或者使用doseq而不是使用map,doseq也可以用于副作用,而不像map不会花时间构建您将无法访问的对象.