Clojure 克洛朱尔:懒惰的魔法
几乎有两个相同的程序生成无限多个随机数。 第一个没有崩溃。出现OutOfMemoryError异常的第二次崩溃。为什么?Clojure 克洛朱尔:懒惰的魔法,clojure,lazy-evaluation,lazy-sequences,Clojure,Lazy Evaluation,Lazy Sequences,几乎有两个相同的程序生成无限多个随机数。 第一个没有崩溃。出现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 (i
;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)
我相信这是一个“抱头”的例子 通过在第二个示例中引用r1,您可以在后面说类似于
(first r1)
的话,这样您将最终存储惰性seq的成员,因为它们被具体化了
在第一种情况下,Clojure可以确定不会对无限序列的早期成员执行任何操作,这样它们就可以被处置,而不会消耗内存
我本人仍然是一名Clojure初学者,非常感谢对我的理解或术语的任何评论或更正。我也是一名初学者,但您的解释看起来非常正确。如果不是你赢了我,我也会回答同样的问题!当我不久前开始在Clojure中处理Project Euler问题时,我在无限延迟序列上的调试打印减慢了我的程序速度。。。无限。无限延迟序列是一个重要的Clojure概念,需要处理。顺便说一句,为什么没有堆栈溢出。inf中存在无限递归,因此没有堆栈溢出,因为惰性计算不会递归堆栈。对每个元素求值并返回。