Клююр:ленивая магия
-
20-09-2019 - |
Вопрос
Почти две одинаковые программы для генерации бесконечных ленивых последовательностей случайных чисел.Первый не дает сбоев.Второй сбой с исключением 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)
Решение
Я считаю, что это пример «держаться за голову».
Сделав ссылку r1 во втором примере, вы открываете возможность позже сказать что-то вроде (first r1)
так что в конечном итоге вы сохраните члены вашего lazy-seq по мере их материализации.
В первом случае Clojure может определить, что с более ранними членами бесконечной последовательности ничего не будет делаться, чтобы от них можно было избавиться и не занимать память.
Я сам все еще новичок в Clojure, поэтому буду очень признателен за любые комментарии или исправления в моем понимании или терминологии.