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, любые комментарии или поправки к моему пониманию или терминологии очень ценятся.