Если единственная циклическая конструкция, не потребляющая стек, в Clojure - это «recur», как работает этот lazy-seq?
Страница ClojureDocs дляlazy-seq
приводит пример генерации lazy-seq всех положительных чисел:
(defn positive-numbers
([] (positive-numbers 1))
([n] (cons n (lazy-seq (positive-numbers (inc n))))))
Этот lazy-seq может быть оценен для довольно больших индексов без выброса ошибки StackOverflowError (в отличие от примера sieve на той же странице):
user=> (nth (positive-numbers) 99999999)
100000000
Еслитолькоrecur
может использоваться, чтобы избежать потребления кадров стека в рекурсивной функции, как возможно, что этот пример lazy-seq может вызывать себя без переполнения стека?