![](/img/trans.png)
[英]What is the difference between this `doseq` statement and a `for` statement; reading file in clojure?
[英]Difference between doseq and for in Clojure
在Clojure中,doseq和for有什么区别? 什么时候您会选择使用一个而不是另一个呢?
区别在于, for
构建一个惰性序列并返回它,而doseq
用于执行副作用并返回nil。
user=> (for [x [1 2 3]] (+ x 5))
(6 7 8)
user=> (doseq [x [1 2 3]] (+ x 5))
nil
user=> (doseq [x [1 2 3]] (println x))
1
2
3
nil
如果要基于其他序列构建新序列,请使用for。 如果要根据某些序列中的元素产生副作用(打印,写入数据库,发射核弹头等),请使用doseq。
还要注意, doseq
渴望而for
则是懒惰的。 雷恩答案中缺少的例子是
(for [x [1 2 3]] (println x))
在REPL上,这通常会做您想要的事情,但这基本上是一个巧合:REPL强制for
产生的延迟序列,从而导致printlns发生。 在非交互式环境中,不会打印任何内容。 您可以通过比较以下结果来了解实际情况
user> (def lazy (for [x [1 2 3]] (println 'lazy x)))
#'user/lazy
user> (def eager (doseq [x [1 2 3]] (println 'eager x)))
eager 1
eager 2
eager 3
#'user/eager
因为def
形式返回创建的新var,而不是绑定的值,所以REPL没有要打印的内容,并且lazy
将引用未实现的lazy-seq:根本没有计算任何元素。 eager
将引用nil
,并且其所有打印都将完成。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.