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 <[email protected]> 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 [email protected]
> Note that posts from new members are moderated - please be patient with your
> first post.
> To unsubscribe from this group, send email to
> [email protected]
> 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 [email protected].
> 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 [email protected]
Note that posts from new members are moderated - please be patient with your
first post.
To unsubscribe from this group, send email to
[email protected]
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 [email protected].
For more options, visit https://groups.google.com/d/optout.