11

几乎 2 个相同的程序来生成无限的惰性随机序列。第一个不会崩溃。出现 OutOfMemoryError 异常的第二次崩溃。为什么?

;Return infinite lazy sequence of random numbers    
(defn inf-rand[] (lazy-seq (cons (rand) (inf-rand))))    

;Never returns. Burns the CPU but won't crash and lives forever.    
(last (inf-rand))

但是以下崩溃很快:

;Return infinite lazy sequence of random numbers    
(defn inf-rand[] (lazy-seq (cons (rand) (inf-rand))))    
(def r1 (inf-rand))

;Crash with "OutOfMemoryError"
 (last r1)
4

1 回答 1

22

我相信这是一个“抱头”的例子。

通过在第二个示例中引用 r1,您打开了稍后说出类似内容的可能性,(first r1)因此您最终将存储惰性序列的成员,因为它们被具体化。

在第一种情况下,Clojure 可以确定永远不会对无限序列的早期成员执行任何操作,因此可以处理它们而不消耗内存。

我自己仍然是一个 Clojure 初学者,任何对我的理解或术语的评论或更正都非常感谢。

于 2009-11-18T15:04:59.023 回答