Pregunta

Casi 2 programas idénticos para generar SEQs perezosos infinitas de randoms. La primera no se desplome. El segundo accidente con OutOfMemoryError excepción. ¿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))

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

Solución

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

Al hacer referencia r1 en el segundo ejemplo se abre la posibilidad de decir algo así como más tarde (first r1) por lo que el resultado final será el almacenamiento de los miembros de su flojo-ss, ya que están materializadas.

En el primer caso Clojure puede determinar que nada volverá a ser hecho con los miembros anteriores de la secuencia infinita para que puedan ser eliminados y no consumen memoria.

Estoy siendo en gran medida un principiante Clojure mí mismo, cualquier comentario o corrección a mi entendimiento o la terminología muy apreciado.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top