This might help: http://stuartsierra.com/2015/08/25/clojure-donts-lazy-effects On 24 Sep 2015 01:14, "Charles Reese" <charlespre...@gmail.com> wrote:
> I want to compute a lazy sequence of primes. > > Here is the interface: > > user=> (take 10 primes) > (2 3 5 7 11 13 17 19 23 29) > > So far, so good. > > However, when I take 500 primes, this results in a stack overflow. > > core.clj: 133 clojure.core/seq > core.clj: 2595 clojure.core/filter/fn > LazySeq.java: 40 clojure.lang.LazySeq/sval > LazySeq.java: 49 clojure.lang.LazySeq/seq > RT.java: 484 clojure.lang.RT/seq > core.clj: 133 clojure.core/seq > core.clj: 2626 clojure.core/take/fn > LazySeq.java: 40 clojure.lang.LazySeq/sval > LazySeq.java: 49 clojure.lang.LazySeq/seq > Cons.java: 39 clojure.lang.Cons/next > LazySeq.java: 81 clojure.lang.LazySeq/next > RT.java: 598 clojure.lang.RT/next > core.clj: 64 clojure.core/next > core.clj: 2856 clojure.core/dorun > core.clj: 2871 clojure.core/doall > core.clj: 2910 clojure.core/partition/fn > LazySeq.java: 40 clojure.lang.LazySeq/sval > LazySeq.java: 49 clojure.lang.LazySeq/seq > RT.java: 484 clojure.lang.RT/seq > core.clj: 133 clojure.core/seq > core.clj: 2551 clojure.core/map/fn > LazySeq.java: 40 clojure.lang.LazySeq/sval > LazySeq.java: 49 clojure.lang.LazySeq/seq > RT.java: 484 clojure.lang.RT/seq > core.clj: 133 clojure.core/seq > core.clj: 3973 clojure.core/interleave/fn > LazySeq.java: 40 clojure.lang.LazySeq/sval > > I'm wondering what is the problem here and, more generally, when working > with lazy sequences, how should I approach this class of error? > > Here is the code. > > (defn assoc-nth > "Returns a lazy seq of coll, replacing every nth element by val > > Ex: > user=> (assoc-nth [3 4 5 6 7 8 9 10] 2 nil) > (3 nil 5 nil 7 nil 9 nil) > " > [coll n val] > (apply concat > (interleave > (map #(take (dec n) %) (partition n coll)) (repeat [val])))) > > (defn sieve > "Returns a lazy seq of primes by Eratosthenes' method > > Ex: > user=> (take 4 (sieve (iterate inc 2))) > (2 3 5 7) > > user=> (take 10 (sieve (iterate inc 2))) > (2 3 5 7 11 13 17 19 23 29) > " > [s] > (lazy-seq > (if (seq s) > (cons (first s) (sieve > (drop-while nil? (assoc-nth (rest s) (first s) > nil)))) > []))) > > (def primes > "Returns a lazy seq of primes > > Ex: > user=> (take 10 primes) > (2 3 5 7 11 13 17 19 23 29) > " > (concat [2] (sieve (filter odd? (iterate inc 3))))) > > -- > 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.