因为`for`返回(评估为)一个惰性序列,这意味着它只会在消费时实现单个元素——这只是一个粗略的近似,但大致上是Clojure惰性所在。采用惰性之一的原因就是不需要实现整个(可能是无限的)序列,所以产生惰性序列的操作(如for)可以快速返回。
所以cnt'的值是一个惰性序列。当你打印它时,打印机可以看到它是一个序列,所以它会迭代其元素,这将导致它们被实现,触发代码中实现元素时的副作用。
vec产生一个非惰性向量,因此它需要cnt'中的所有元素,也会导致它们被实现。doall专门用于实现所有元素的目的。
要回答问题“为什么Clojure不等待cnt'评估”——它确实等待着,但正如上面所写的,cnt'评估为惰性序列,这不能保证它的任何元素都已被实现。
我认为惰性效果是一种不良做法