Предположим, я написал:
(def stuff
(lazy-seq stuff))
Когда я запрашиваю значение stuff
в REPL, я ожидаю, что оно застрянет в бесконечном l oop, поскольку я определяю stuff
сам по себе (что практически ничего не говорит об этой последовательности).
Однако вместо этого я получил пустую последовательность.
> stuff
()
Почему?
Edit: Под «рекурсивным» я имел в виду рекурсивные данные, а не рекурсивные функции.
Я все еще не понимаю, почему последовательность завершилась. Для сравнения, следующий код - это застрял в бесконечном l oop (и взрывает стек).
(def stuff
(lazy-seq (cons (first stuff) [])))
Некоторая предыстория: этот вопрос возникает из-за того, что я пытаюсь реализовать генератор простых чисел, используя решето Эратосфена. Моя первая попытка была:
(def primes
(lazy-seq (cons 2
(remove (fn [x]
(let [ps (take-while #(< % x) primes)]
(some #(zero? (mod x %)) ps)))
(range 3 inf))))) ;; My customized range function that returns an infinite sequence
Я полагал, что это никогда не сработает, поскольку take-while
будет продолжать запрашивать больше простых чисел, даже если их еще нельзя было вычислить. Поэтому меня удивило, когда он сработал довольно хорошо.
> (take 20 primes)
(2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71)