Domanda

Quasi 2 programmi identici per generare infinite seguenti del regolamento provvisorio pigri randoms. Il primo non va in crash. Il secondo incidente ad eccezione OutOfMemoryError. Perché?

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

Ma il seguente incidente abbastanza rapidamente:

;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)
È stato utile?

Soluzione

Credo che questo sia un esempio di "tenendo sulla testa".

Per rendere la R1 di riferimento nel secondo esempio si apre la possibilità di più tardi dicendo qualcosa come (first r1) così si finirà per memorizzare i membri della vostra lazy-ss come sono reificati.

Nel primo caso Clojure può determinare che nulla sarà mai essere fatto con precedenti membri della sequenza infinita modo che possano essere smaltiti e non consumano memoria.

Sono ancora molto un Clojure principiante me stesso, commenti o correzioni mia comprensione o la terminologia molto apprezzato.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top