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