Clojure: ленивая магия - PullRequest
       44

Clojure: ленивая магия

11 голосов
/ 18 ноября 2009

Почти 2 идентичные программы для генерации бесконечных ленивых последовательностей случайностей. Первый не падает. Второй сбой с исключением 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)

1 Ответ

23 голосов
/ 18 ноября 2009

Я считаю, что это пример "держаться за голову".

Делая ссылку r1 во втором примере, вы открываете возможность позже сказать что-то вроде (first r1), так что вы в конечном итоге будете хранить членов вашего lazy-seq по мере их реализации.

В первом случае Clojure может определить, что ничего не будет сделано с более ранними членами бесконечной последовательности, поэтому они могут быть уничтожены и не потреблять память.

Я все еще сам начинающий на Clojure, любые комментарии или исправления к моему пониманию или терминологии очень ценятся.

...