Использование ленивых последовательностей в Clojure

Мне трудно понять, как создать ленивую последовательность в 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 находится вне вызова конъюнктуры, как препятствует ли это конъюнктуре генерировать бесконечную последовательность при оценке?

Мой второй вопрос: всегда ли определения ленивых последовательностей принимают такую ​​общую форму?

42
задан lightlazer 19 February 2015 в 23:00
поделиться