2009-11-18 6 views
11

Prawie 2 identyczne programy do generowania nieskończonej liczby leniwych randoms. Pierwsza nie ulega awarii. Druga awaria z wyjątkiem OutOfMemoryError. Czemu?Clojure: leniwa magia

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

Ale po awarii dość szybko:

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

Odpowiedz

23

Wierzę, że jest to przykład „trzyma na głowie”.

Wykonując referencję r1 w drugim przykładzie, otwierasz możliwość późniejszego powiedzenia czegoś takiego jak (first r1), więc skończysz przechowywać członków swojego leniwego seqa, gdy są reifikowani.

W pierwszym przypadku Clojure może ustalić, że nic nigdy nie zostanie zrobione z wcześniejszymi członkami nieskończonej sekwencji, aby można je było pozbyć się i nie zużywać pamięci.

Sam nadal jestem początkującym Clojure, wszelkie uwagi lub poprawki do mojego zrozumienia lub terminologii są bardzo cenne.

+0

Jestem również początkującym, ale twoje wyjaśnienie wygląda bardzo poprawnie. Odpowiedziałbym na to samo, gdybyś mnie nie pobił! A 6 przegranych jest zgodnych z tobą. –

+0

Kiedy zacząłem robić problemy z projektem Eulera w Clojure jakiś czas temu, moje wydruki debugowania na nieskończonych, leniwych sekwencjach spowolniły moje programy ... w nieskończoność. Nieskończone, leniwe sekwencje są ważną koncepcją Clojure, z którą można się uporać. –

+2

BTW, jak to się stało, że nie ma StackOverflow. Istnieje nieskończona rekursja w inf-rand – GabiMe

Powiązane problemy