Hi

You can try the following

(defn dividers   [primes n]
  (take-while #(<= (* % %) n) primes))

(defn prime? [primes n]
  (every? #(pos? (rem n %))
          (dividers primes n)))

(defn range-peek [coll]
  (iterate inc (-> coll peek inc)))

(defn sieve
  ([] (cons 2 (lazy-seq (sieve [2]))))
  ([primes]
   (let [p (->> primes
                range-peek
                (filter (partial prime? primes))
                first)]
     (cons p (lazy-seq (sieve (conj primes p)))))))

(last (take 10000 (sieve)))

This version keeps the visited primes in a vector so it will grow in memory but 
won’t overflow otherwise.

Sergio

On 04 Nov 2015, at 15:44, Matthew Ulrich <mattyulr...@gmail.com> wrote:

> All - 
> 
> I'm trying to generate a lazy sequence of primes using Erastosthenes Sieve 
> (from Abelson & Sussman) and am encountering some issues with lazy sequence.
> 
> Here's what I have:
> ---
> 
> (defn divisible?
>   [input numerator]
>   (= 0 (mod input numerator)))
> 
> (defn sieve
>   [stream]
>   (lazy-seq
>     (cons
>       (first stream)
>       (sieve (filter #(not (divisible? % (first stream))) (rest stream))))))
> 
> (def primes (sieve (iterate inc 2)))
> 
> ---
> 
> This is fine now when I:
> 
> => (take 5 (drop 1000 primes))
> (7927 7933 7937 7949 7951)
> 
> 
> But when I:
> 
> => (take 5 (drop 4000 primes))
> StackOverflowError    clojure.lang.LazySeq.sval  (LazySeq.java:40)
> 
> 
> --
> 
> I understand how the StackOverflow occurs with the filter on the recursively 
> generated sequence... however I can't think of a way to make this work..
> 
> I'm pretty new to clojure so I'm not very familiar with all of the language 
> features; is there some tool to help me realize this or should I just go 
> about the implementation in a different way?
> 
> Thanks - have a great morning!
> 
> Matty
> 
> -- 
> You received this message because you are subscribed to the Google
> Groups "Clojure" group.
> To post to this group, send email to clojure@googlegroups.com
> Note that posts from new members are moderated - please be patient with your 
> first post.
> To unsubscribe from this group, send email to
> clojure+unsubscr...@googlegroups.com
> For more options, visit this group at
> http://groups.google.com/group/clojure?hl=en
> --- 
> You received this message because you are subscribed to the Google Groups 
> "Clojure" group.
> To unsubscribe from this group and stop receiving emails from it, send an 
> email to clojure+unsubscr...@googlegroups.com.
> For more options, visit https://groups.google.com/d/optout.

-- 
You received this message because you are subscribed to the Google
Groups "Clojure" group.
To post to this group, send email to clojure@googlegroups.com
Note that posts from new members are moderated - please be patient with your 
first post.
To unsubscribe from this group, send email to
clojure+unsubscr...@googlegroups.com
For more options, visit this group at
http://groups.google.com/group/clojure?hl=en
--- 
You received this message because you are subscribed to the Google Groups 
"Clojure" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to clojure+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to