1:2 user=> (reduce #(concat %1 (if (> %2 6) [ :foo %2] [%2])) [] '(3 4 5 8 4 2)) (3 4 5 :foo 8 4 2)
Not good, the expected result would have been (3 4 5 :foo 8 4 2 :foo) Regards, -- Laurent 2009/4/23 Emeka <emekami...@gmail.com>: > > (reduce #(concat %1 (if (> %2 6) [ :foo %2] [%2])) [] '(3 4 5 8 4 2)) > > Note that I am not a programmer and do not know much about writing code, > however the above snippet in my view can achieve the result you desired. I > invite comments on the above. > > Regards, > Emeka > On Thu, Apr 23, 2009 at 10:52 AM, Christophe Grand <christo...@cgrand.net> > wrote: >> >> *Warning this message contains mutable state and may hurt functional >> sensibilities.* >> >> Ugly hack: >> >> (defn my-split-with [pred coll] >> (let [s (atom coll) >> p #(when-let [r (pred %)] (swap! s rest) r)] >> [(take-while p coll) (drop-while pred (lazy-seq @s))])) >> >> Now it works ;-) >> >> Laurent PETIT a écrit : >> > This is a general problem with function (split-with) (and derivatives >> > such as partition-by ...), >> > >> > This should certainly deserve a mention in their respective >> > docstrings, I think. Because the docstring speak about lazyness, but >> > not the kind of lazyness that can avoid Out of Memory in corner cases. >> > >> > Rich, if you agree with that, would you me to issue a patch on google >> > group ? >> > >> > 2009/4/23 Christophe Grand <christo...@cgrand.net>: >> > >> >> Laurent PETIT a écrit : >> >> >> >>> Hi Meikel, >> >>> >> >>> It seems to me that your version is the only safe one so far, that >> >>> would succesfully indefinitely return values with this test: >> >>> >> >>> (dorun (mystery-function true? :foo (repeat true))) >> >>> >> >>> Mine, a new version of mine I'll never bother to publish, and >> >>> Christophe's all retain head. >> >>> To explain on Christophe's one for example: >> >>> >> >>> It uses (split-with) which, in case pred always match coll elements, >> >>> will retain the head of coll in etc, while eating more and more >> >>> elements of coll via running on run : >> >>> 1:21 user=> (defn mystery-function [pred coll] >> >>> (lazy-seq >> >>> (when (seq coll) >> >>> (let [[run etc] (split-with pred coll)] >> >>> (if (seq run) >> >>> (concat run (cons :foo (mystery-function pred etc))) >> >>> (cons (first coll) (mystery-function pred (rest coll)))))))) >> >>> 1:22 user=> (dorun (mystery-function true? (repeat true))) >> >>> java.lang.OutOfMemoryError: GC overhead limit exceeded (repl-1:22) >> >>> >> >>> >> >> Nice catch! >> >> >> >> >> >> -- >> >> Professional: http://cgrand.net/ (fr) >> >> On Clojure: http://clj-me.blogspot.com/ (en) >> >> >> >> >> >> >> >> >> > >> > > >> > >> > >> >> >> -- >> Professional: http://cgrand.net/ (fr) >> On Clojure: http://clj-me.blogspot.com/ (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 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 -~----------~----~----~----~------~----~------~--~---