Clojure,惰性求值问题

3
考虑以下Clojure代码:
(let [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的剩余部分。
这是由于序列的惰性求值引起的吗?
1个回答

6

这段代码本质上并不是惰性的——它应该按照正确的顺序执行。

然而,取决于变量ab是什么,它们内部可能会包含一些惰性的内容,只有当执行(println a)(println b)时才会被执行。特别地,如果ab是使用map或类似方法创建的惰性序列,则序列的后续部分只在强制在println语句中执行时才会被计算。要更具体地说,您需要描述ab的内部结构。

我实际上怀疑问题可能是由于缓冲区未刷新导致的——请参见Clojure - Side Effects Happening Out Of Order


println 应该自动刷新。如果您使用的是 print,则通常只需要手动刷新。 - Paul Sanwald

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接