作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我是 Clojure 的新手,有时我遇到了这个问题。
我的程序中有这样的代码:
(let [ ... ]
(map (fn [[v f]] (do-side-effect v f)) {:v1 f1, :v2 f2})
(do-the-job ...))
这个do-side-effect
可以是例如intern
等另一个副作用函数的println
。问题是不会发生副作用。
但是如果我把行改成
(println (map #(fn [[v f]] (do-side-effect v f)) {:v1 f1, :v2 f2}))
然后一切就OK了。所以我想到的最后一个想法是 clojure只需优化 map
因为它认为它的结果是无用的,因为我不使用它。
万一这真的发生了,我如何向 clojure 展示这种形式会产生副作用以防止编译器对其进行优化吗?
万一是bug,怎么才能找到bug在哪里呢?
最佳答案
map
是懒惰的。它并不意味着直接用于副作用,它只在它们被消耗时产生值。
你可以使用dorun
强制实现值,即使你没有消费它们,或者使用doseq
代替map,doseq
旨在用于副作用,与 map 不同,它不会花时间构建您永远不会访问的对象。
关于clojure - 副作用优化掉,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31097067/
我正在编写一个快速的 preg_replace 来从 CSS 中删除注释。 CSS 注释通常有这样的语法: /* Development Classes*/ /* Un-comment me for
使用 MySQL,我有三个表: 项目: ID name 1 "birthday party" 2 "soccer match" 3 "wine tasting evening" 4
我是一名优秀的程序员,十分优秀!