2010-05-31 12 views
17

Busco a través de algún ejemplo de Fibonacci código de secuencia clojure:¿Cuál es el punto de lazy-seq en clojure?

(def fibs (lazy-cat [1 2] (map + fibs (rest fibs)))) 

lo general entiendo lo que está pasando, pero no consigue el punto de lazy-cat. sé que lazy-cat es una macro que se traduce a algo como esto:

(def fibs (concat (lazy-seq [1 2]) (lazy-seq (map + fibs (rest fibs))))) 

¿Qué es exactamente lazy-seq que Realiza? ¿Todavía sería evaluado perezosamente incluso sin lazy-seq? ¿Esto es estrictamente para el almacenamiento en caché?

EDIT: Gracias por las respuestas. Mi confusión fue que funcionó con un simple concat de REPL porque tenía un enlace previo a fibs en el alcance.

Respuesta

16

El lazy-seq en [1 2] no es necesario, pero realmente no duele.

El lazy-seq en (map + fibs (rest fibs)) es esencial; sin él, la llamada a la función se evaluará antes de que fibs se vincule a un valor, lo que causará una excepción. Envolviéndolo en lazy-seq, la llamada se aplazará hasta que se necesite el valor, y fibs tendrá un valor en ese punto.

7

Como lo entiendo (y admito a dejar de ser un recién llegado a Clojure!), Si se intenta lo siguiente:

(def fibs (concat [1 2] (map + fibs (rest fibs)))) 

Entonces no funcionará porque mentiras aún no se ata y se por lo tanto, las dos referencias posteriores fallan.

Sin embargo, la versión diferida que proporcione funcionará, ya que las referencias a las fibs solo se resuelven en un momento posterior cuando se consume la secuencia, y en ese momento las fibs ya se han definido correctamente como la secuencia diferida.