4

我不明白为什么这个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 有效?

4

1 回答 1

3

在您的示例函数中返回 lazyseq (0 (1 (2 (3 (...)))))。这就是为什么dorun在没有 stackoverflow 的情况下运行(有两个元素的序列0并且(1 (2 (...)))dorun评估)并且second失败(它返回 repl 尝试评估以打印出的无限嵌套序列)。

我猜你正在寻找这个解决方案

(defn very-lazy [s]
  (lazy-seq
   (if (seq s)
     (cons (first s) (very-lazy (rest s)))
     [])))

(take 10 (very-lazy (range 200000000)))
-> (0 1 2 3 4 5 6 7 8 9)
于 2012-12-22T12:54:28.357 回答