Мне трудно понять, как создать ленивую последовательность в Clojure.
Документация для макроса мне совершенно не понятна:
Использование: (lazy-seq и body) Принимает тело выражений, которое возвращает ISeq или nil, и дает объект Seqable, который будет вызывать тело только в первый раз вызывается и кэширует результат и возвращает его на все последующие seq.
Все примеры, которые я видел, похоже, делают следующее:
; 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)))
)
Итак, первое, чего я не получаю, так как lazy-seq находится вне вызова conj, как он предотвращает объединение от создания бесконечной последовательности при оценке?
Мой второй вопрос заключается в том, что ленивые определения последовательностей всегда принимают эту общую форму?