作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我写了一个简单的程序,它接受一个数字 n 和一个列表作为输入。然后将列表中的每个元素打印 n 次。
我最初尝试过这个
(defn list-repl [num lst]
(doseq [elem lst]
(map println (repeat num elem))))
这没有用。无输出。然后在查看文档时我发现了 dorun
。我试过了,它确实有效。
(defn list-repl [num lst]
(doseq [elem lst]
(dorun (map println (repeat num elem)))))
阅读文档我能理解的是 doseq就像一个循环结构,它会在其 body 表达中产生副作用。 dorun也直接对序列执行此操作。
这个理解对吗?如果它是正确的,那么第一个例子中的正文应该给我打印数字的副作用。但那并没有发生。那么我的理解中缺少什么?
最佳答案
基本上,doseq
无法在其体内强制产生所有副作用。为了保证它必须递归地检查其主体中的每个表达式以强制进行惰性子计算,这将是……具有挑战性的。它只处理顶级表达式。强制执行任何惰性子计算是表达式作者的工作。
如果您需要多层循环来“解包”外部序列的成员,请记住 doseq
、for
和其他变体都通过提供超过一个绑定(bind):
(defn list-repl [num lst]
(doseq [elem lst
to-print (repeat num elem)]
(println to-print)))
关于clojure - doseq 应该给我副作用,那为什么它只适用于 dorun?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33463900/
我写了一个简单的程序,它接受一个数字 n 和一个列表作为输入。然后将列表中的每个元素打印 n 次。 我最初尝试过这个 (defn list-repl [num lst] (doseq [elem
函数doall、dorun、doseq和for之间有什么区别? 我发现一些信息分散在互联网上,但我认为最好将这些信息集中在这里。 最佳答案 dorun、doall 和 doseq 都用于强制惰性序列,
我是一名优秀的程序员,十分优秀!