(println(iterate inc 0)):为什么这甚至开始打印?

kim*_*imh 5 clojure lazy-sequences

当我(println (iterate inc 0))在我的repl中运行时,我会得到这样的东西:

user=> (println (iterate inc 0))
(0 1 2 3 4 5 6 7 8 9 10 11 12 13 ....................
Run Code Online (Sandbox Code Playgroud)

我运行代码的期望是repl什么都没显示,只是因为(iterate inc 0)永远不会结束而卡住了.但是,我明白了(0 1 2 3 ....

(iterate inc 0)产生永不回归的无限序列.如果它永远不会结束,那为什么要println开始印刷价值?

换句话说,(println xx)即使输入从未完成评估,为什么开始评估?

Ant*_* R. 8

你应该读一下Clojure中的lazy seqs.它们能够产生在实现整个序列之前可以逐步消耗的值(在这种情况下,永远不会发生).

将其视为推拉与拉动可能会有所帮助.而不是迭代创建一个完整的值列表,然后将它们推送到println函数(这将永远不会发生),迭代只是将它交给一个懒惰的序列,println根据需要拉取值.这就是为什么(取5(iterate inc 0))有效; 在停止之前只尝试拉5个值.