我不明白为什么这个lazy-seq会导致stackoverflow错误,而在将序列传递给dorun时却不会发生此错误:
如果它是懒惰的,那么
(defn very-lazy [s]
(lazy-seq
(if (seq s)
[(first s) (very-lazy (rest s))]
[])))
(dorun (very-lazy (range 200000000)))
>nil
(take 2 (very-lazy (range 20000000))
>...(1577 (java.lang.StackOverflowError
如果它是懒惰的,那么
take 2
应该只让懒惰序列迭代两次,为什么不会发生,而且为什么dorun起作用?
(repeat 1)
是一个坏主意。 - Alex*print-length*
来限制输出,例如(set! *print-length* 10)
,在 repl 中执行(repeat 1)
将会输出(1 1 1 1 1 1 1 1 1 1 ...)
。 - mobyte