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)
Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top