Thanks Meikel. On 5月5日, 下午9时40分, Meikel Brandmeyer <m...@kotka.de> wrote: > Hi, > > On 5 Mai, 14:54, Robert Luo <robort...@gmail.com> wrote: > > > (defn repeated-seq > > [f start] > > (let [coll (f start)] > > (concat coll (lazy-seq (repeated-seq f (last coll)))))) > > > it is OK when I call it with: > > (repeated-seq #(range % 5) 0) > > repeated-seq cannot do anything about the problem. You have to ensure > that your f is free of "overlap" (so to say). One way todo that in > your example is (repeated-seq #(-> % inc (range 5)) -1).
In my example function, f could avoid overlapping by itself. But sometimes the underlying f is difficult to ensure that, and my intention is to let repeated-seq to do it rather than leave it to it's client. > > Also depending on the size of your intermediate seqs you might want to > roll your own concat or use knowledge of the underlying collection > type to avoid the slow last. > Thanks for point out that. > (defn roll-your-own-repeated-seq > [f init] > (let [step (fn step > [s] > (lazy-seq > (when-let [[fst & rst] s] > (if rst > (cons fst (step rst)) > (cons fst (roll-your-own-repeated-seq f > fst))))))] > (lazy-seq > (step (seq (f init)))))) > > (defn vector-repeated-seq > [f init] > (lazy-seq > (let [v (f init)] > (when-let [s (seq v)] > (concat s (lazy-seq (vector-repeated-seq f (peek v)))))))) > > Hope this helps. > > Sincerely > Meikel > > -- > 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 > athttp://groups.google.com/group/clojure?hl=en -- 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