Clojure: Как избежать переполнения стека в Sieve of Erathosthene?

Вот моя реализация Sieve of Erathosthene в Clojure (основанная на уроке SICP о потоках):

(defn nats-from [n]
  (iterate inc n))

(defn divide? [p q]
  (zero? (rem q p)))

(defn sieve [stream]
  (lazy-seq (cons (first stream)
            (sieve (remove #(divide? (first stream) %) 
               (rest stream))))))

(def primes (sieve (nats-from 2)))

Теперь все нормально, когда я беру первые 100 простых чисел:

(take 100 primes)

Но если я попытаюсь взятьпервые 1000 простых чисел, программа прерывается из-за переполнения стека. Мне интересно, можно ли как-то изменить функцию sieve, чтобы она стала хвостовой рекурсивной и, тем не менее, чтобы сохранить «поток» алгоритма?

Любая помощь???

Ответы на вопрос(1)

Ваш ответ на вопрос