Uso de secuencia diferida de Clojure


Answers

Question

Tengo problemas para entender cómo se crea una secuencia perezosa en Clojure.

La documentación para la macro no está nada clara para mí:

Uso: (lazy-seq & body) Toma un cuerpo de expresiones que devuelve un ISeq o nil, y produce un objeto Seqable que invocará el cuerpo solo la primera vez que se llama a seq, y guardará en caché el resultado y lo devolverá en todos los siguientes llamadas seq.

Todos los ejemplos que he visto, parecen hacer algo como lo siguiente:

; return everything in the sequence starting at idx n
(defn myseq-after-n [n]
  (...)
)

(def my-lazy-seq
  (lazy-seq (conj [init-value] (myseq-after-n 2)))
)

Entonces, lo primero que no entiendo es que, dado que lazy-seq está fuera del llamado a conj, ¿cómo impide que conj genere una secuencia infinita en la evaluación?

Mi segunda pregunta es, ¿las definiciones de secuencia diferida siempre toman esta forma general?




Links