2009-11-18 9 views
11

Casi 2 programas idénticos para generar infinitos secesos perezosos de randoms. El primero no falla. El segundo bloqueo con la excepción OutOfMemoryError. ¿Por qué?Clojure: magia floja

;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)) 

Pero el siguiente choque con bastante rapidez:

;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) 

Respuesta

23

Creo que esto es un ejemplo de "la celebración en la cabeza".

Al hacer la referencia r1 en el segundo ejemplo, abre la posibilidad de decir algo más tarde como (first r1), por lo que terminará almacenando los miembros de su Lazy-Seq a medida que se reifican.

En el primer caso Clojure puede determinar que nunca se hará nada con los miembros anteriores de la secuencia infinita para que puedan eliminarse y no consumir memoria.

Todavía soy un principiante de Clojure, cualquier comentario o corrección de mi comprensión o terminología es muy apreciada.

+0

Soy un principiante también, pero su explicación parece muy correcta. ¡Hubiera respondido lo mismo si no me hubieras vencido! Y 6 videntes parecen estar de acuerdo contigo. –

+0

Cuando comencé a hacer problemas con Project Euler en Clojure hace un tiempo, mis depuraciones en infinitas secuencias perezosas ralentizaban mis programas ... infinitamente. Las secuencias perezosas infinitas son un concepto importante de Clojure con el que lidiar. –

+2

Por cierto, ¿cómo es que no hay StackOverflow. Hay una recursión infinita en inf-rand – GabiMe

Cuestiones relacionadas