繁体   English   中英

Clojure中的dq和for之间的差异

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM