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

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

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

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

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

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