几乎有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)
答案 0 :(得分:23)
我相信这是“抓住头脑”的一个例子。
通过在第二个例子中使用引用r1,你可以在后面说出类似(first r1)
之类的内容,这样你最终就可以存储lazy-seq的成员了。
在第一种情况下,Clojure可以确定无限序列的早期成员不会做任何事情,因此可以将它们处理掉而不消耗内存。
我自己仍然是一名Clojure初学者,对我的理解或术语的任何评论或更正都非常感激。