Вопрос

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top