Clojure,懒惰的评估问题

时间:2012-04-24 08:18:57

标签: clojure

在clojure中考虑以下代码:

(让[a(find-a),b(find-b)]   (println a)   (println b) )

其中b是序列。函数find-a中也有一些println语句。 我期望在标准输出中看到的是: 一个, find-a中println语句的结果, 湾 但是,我得到的是: 一个, b的一部分, find-a中println语句的结果, 其余的b。

这是由于对序列的懒惰评估吗?

1 个答案:

答案 0 :(得分:6)

此代码中没有任何内容本身就是懒惰的 - 它应该以正确的顺序执行。

但是,根据ab的内容,可能会在其中嵌入一些延迟内容,只有在(println a)(println b)执行时才会执行。特别是,如果ab是使用map或类似内容创建的延迟序列,那么序列的后续部分将仅在println内强制执行时进行评估声明。更具体地说,您需要描述ab的内部结构。

我实际上怀疑问题可能是因为缓冲区未被刷新 - 请参阅Clojure - Side Effects Happening Out Of Order