Frage

Fast 2 identische Programme faul ASTA von randoms erzeugen unendlich. Der erste nicht abstürzt. Der zweite Absturz mit OutOfMemoryError Ausnahme. Warum?

;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))

Aber der folgende Crash ziemlich schnell:

;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)
War es hilfreich?

Lösung

Ich glaube, dies ist ein Beispiel für „auf den Kopf halten“.

Indem die Referenz R1 im zweiten Beispiel die Möglichkeit eröffnen die später etwas sagen wie (first r1), so dass Sie die Mitglieder Ihrer lazy-Seq Speicherung werden am Ende, wie sie verdinglicht werden.

Im ersten Fall Clojure, dass nichts feststellen kann, wird immer mit früheren Mitgliedern der unendlichen Folge durchgeführt werden, so dass sie entsorgt werden können und nicht verbrauchen Speicher.

Ich bin immer noch sehr viel ein Clojure Anfänger ich, Kommentare oder Korrekturen an meinem Verständnis oder Terminologie sehr geschätzt.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top