Здесь моя реализация Сита Эратосфена в 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 простых чисел, программа прерывается из-за. Мне интересно, возможно ли изменить как-то сито функции, чтобы стать хвостовым рекурсивным и, тем не менее, сохранить "потоки" алгоритма?
Любая помощь???