考虑 clojure 中的以下代码:
(让 [a (find-a), b (find-b)] (println a) (println b) )
其中 b 是一个序列。在函数 find-a 中也有一些 println 语句。我希望在标准输出中看到的是:a,find-a 中 println 语句的结果,b。但是,我得到的是:a,b 的一部分,来自 find-a 中的 println 语句,b 的其余部分。
这是由于对序列的懒惰评估吗?
考虑 clojure 中的以下代码:
(让 [a (find-a), b (find-b)] (println a) (println b) )
其中 b 是一个序列。在函数 find-a 中也有一些 println 语句。我希望在标准输出中看到的是:a,find-a 中 println 语句的结果,b。但是,我得到的是:a,b 的一部分,来自 find-a 中的 println 语句,b 的其余部分。
这是由于对序列的懒惰评估吗?
这段代码中没有任何东西天生就是惰性的——它都应该以正确的顺序执行。
但是,取决于什么a
和b
是否有一些惰性嵌入其中,只有在执行时(println a)
才会(println b)
执行。特别是,如果a
和是用mapb
或类似的东西创建的惰性序列,那么序列的后面部分只有在println语句中强制执行时才会被评估。更具体地说,您需要描述 和 的内部结构。a
b
然而,我实际上怀疑问题可能是由于缓冲区没有被刷新 - 请参阅Clojure - Side Effects Happening Out Of Order