Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Clojure 克洛朱尔:懒惰的魔法_Clojure_Lazy Evaluation_Lazy Sequences - Fatal编程技术网

Clojure 克洛朱尔:懒惰的魔法

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

几乎有两个相同的程序生成无限多个随机数。 第一个没有崩溃。出现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)

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

通过在第二个示例中引用r1,您可以在后面说类似于
(first r1)
的话,这样您将最终存储惰性seq的成员,因为它们被具体化了

在第一种情况下,Clojure可以确定不会对无限序列的早期成员执行任何操作,这样它们就可以被处置,而不会消耗内存


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

我也是一名初学者,但您的解释看起来非常正确。如果不是你赢了我,我也会回答同样的问题!当我不久前开始在Clojure中处理Project Euler问题时,我在无限延迟序列上的调试打印减慢了我的程序速度。。。无限。无限延迟序列是一个重要的Clojure概念,需要处理。顺便说一句,为什么没有堆栈溢出。inf中存在无限递归,因此没有堆栈溢出,因为惰性计算不会递归堆栈。对每个元素求值并返回。