Clojure:懒惰的魔法

时间:2009-11-18 14:55:13

标签: clojure lazy-evaluation lazy-sequences

几乎有2个相同的程序可以生成无限懒惰的random序列。 第一个不会崩溃。第二次崩溃与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)

1 个答案:

答案 0 :(得分:23)

我相信这是“抓住头脑”的一个例子。

通过在第二个例子中使用引用r1,你可以在后面说出类似(first r1)之类的内容,这样你最终就可以存储lazy-seq的成员了。

在第一种情况下,Clojure可以确定无限序列的早期成员不会做任何事情,因此可以将它们处理掉而不消耗内存。

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