clojure lazy-evaluation fibonacci infinite-sequence

¿Cuál es el punto de holgazanería en clojure?



lazy-evaluation fibonacci (2)

Como lo entiendo (¡y admito que todavía soy un pariente recién llegado a Clojure!), Si intentas lo siguiente:

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

Entonces no funcionará porque las fibras todavía no están vinculadas y, por lo tanto, las dos referencias posteriores a ellas fallan.

Sin embargo, la versión perezosa que proporcione funcionará, ya que las referencias a los fibs solo se resuelven en un momento posterior cuando se consume la secuencia, y en qué punto los fibs ya se han definido con éxito como la secuencia perezosa.

Estoy mirando a través de algunos ejemplos de código de secuencia de Fibonacci:

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

Generalmente entiendo lo que está pasando, pero no entiendo el punto de lazy-cat . Sé que lazy-cat es una macro que se traduce en algo como esto:

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

¿Qué es exactamente lo que está logrando lazy-seq ? ¿Todavía sería evaluado perezosamente incluso sin lazy-seq ? ¿Es esto estrictamente para propósitos de almacenamiento en caché?

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


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

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