11

ランダムの無限の遅延シーケンスを生成するほぼ 2 つの同一のプログラム。最初はクラッシュしません。OutOfMemoryError 例外による 2 番目のクラッシュ。なんで?

;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

これは「頭を抱える」一例だと思います。

2番目の例で参照r1を作成することにより、後で次のように言う可能性(first r1)が広がり、最終的には、lazy-seqのメンバーが具体化されたときに保存されます。

最初のケースでは、Clojureは、無限シーケンスの以前のメンバーには何も行われないと判断できるため、それらを破棄してメモリを消費することはありません。

私自身はまだClojureの初心者ですが、私の理解や用語に対するコメントや訂正は大歓迎です。

于 2009-11-18T15:04:59.023 に答える