Clojure: Magia preguiçosa
-
20-09-2019 - |
Pergunta
Quase 2 programas idênticos para gerar infinitos seqs preguiçosos de randoms. O primeiro não trava. O segundo acidente com exceção do OrofMemoryError. Por quê?
;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))
Mas o acidente a seguir rapidamente:
;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)
Solução
Eu acredito que este é um exemplo de "segurando a cabeça".
Ao fazer a referência R1 no segundo exemplo, você abre a possibilidade de dizer algo como algo como (first r1)
Então você acabará armazenando os membros do seu preguiçoso seq à medida que eles são reificados.
No primeiro caso, o clojure pode determinar que nada será feito com membros anteriores da sequência infinita, para que possam ser descartados e não consumir memória.
Ainda sou um iniciante em clojure, quaisquer comentários ou correções para o meu entendimento ou terminologia muito apreciados.