Print 实际上在两种情况下都做了完全相同的事情,它只打印了数字。extra.
是由列表内的代码打印的,它恰好与打印的同时发生,4
因此它在屏幕上紧挨着它结束。
额外的点是动态创建的惰性序列的副作用。我会提出一个更详细的例子来澄清这一点:
从两个相同的列表开始,都是完全惰性的:
esc.core=> (def a (iterate #(do (print "making new element") (inc %)) 1))
#'esc.core/a
esc.core=> (def b (iterate #(do (print "making new element") (inc %)) 1))
#'esc.core/b
然后再制作两个相同的列表,分别从a
和的第四个元素开始b
esc.core=> (def a-partially-realized (-> a rest rest rest))
making new elementmaking new element#'esc.core/a-partially-realised
esc.core=> (def b-more-fully-realized (-> b next next next))
making new elementmaking new elementmaking new element#'esc.core/b-more-fully-realised
esc.core=>
的前三个元素a-partially-realized
已预先计算
,而 的前四个元素b-more-fully-realized
已预先计算。
当我们读取它的第一个元素(原始列表中的第四个)时,a-partially-realized
它还没有被计算,所以我们会看到它正在被计算。
esc.core=> (print (first a-partially-realized))
making new element4nil
当我们对它做同样的事情时,b-more-fully-realised
它已经缓存了值,所以我们立即得到结果。
esc.core=> (print (first b-more-fully-realized))
4nil