¿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.