Re: filter-split

2009-03-08 Thread e
On Sun, Mar 8, 2009 at 6:48 AM, Meikel Brandmeyer wrote: > Hi, > > Am 08.03.2009 um 11:44 schrieb Adrian Cuthbertson: > > that's a bit slower than both the previous versions. The reduce >> version does only apply the pred once per item I think? >> > > unzip-with is lazy, the reduce version is no

Re: filter-split

2009-03-08 Thread Meikel Brandmeyer
Hi, Am 08.03.2009 um 11:44 schrieb Adrian Cuthbertson: that's a bit slower than both the previous versions. The reduce version does only apply the pred once per item I think? unzip-with is lazy, the reduce version is not. I would prefer laziness over speed. Sincerely Meikel smime.p7s Desc

Re: filter-split

2009-03-08 Thread e
> This is exactly what I'm trying to avoid. I don't want to traverse > the collection twice. > In that other thread, "Time lies, even with doall", someone helped me figure out a way to get the true time for filter-split, and concluded it was 2- 3 times faster than whats in contrib as expected . .

Re: filter-split

2009-03-08 Thread e
(filt-rem identity '(true nil false 8)) => ((true) ()) > (filt-split identity '(true nil false 8)) => [[true 8] [nil false]] > can't speak for this one, cause I don't know enough clojure > > (filt-rem even? (range 10)) => ((8 6 4 2 0) (9 7 5 3 1)) > (filter-split even? (range 10)) => [(0 2 4 6 8

Re: filter-split

2009-03-08 Thread Adrian Cuthbertson
Hmm, on the same (micro admittedly) benchmark as above... (time (let [[a b] (unzip-with even? (range 10))] [(nth a 4) (nth b 4)])) "Elapsed time: 177.797 msecs" [8 9] that's a bit slower than both the previous versions. The reduce version does only apply the pred once per ite

Re: filter-split

2009-03-08 Thread Christophe Grand
The question showed up the other day on #clojure with the additional constraint to evaluate pred only once per item, here is Rich's solution: http://paste.lisp.org/display/76458#1 (defn unzip-with [pred coll] (let [pvs (map #(vector (pred %) %) coll)] [(for [[p v] pvs :when p] v) (fo

Re: filter-split

2009-03-08 Thread Adrian Cuthbertson
Sorry, further to that last example, if you actually consume all of both even and odd sets then the reduce version is more efficient... (time (let [[a b] (filt-split even? (range 10))] [(nth a 4) (nth b 4)])) "Elapsed time: 36.711 msecs" [8 9] (time (let [[a b] (separate even

Re: filter-split

2009-03-08 Thread Adrian Cuthbertson
You're absolutely right... user=> (time (let [[a b] (separate even? (range 100))] (nth a 3))) "Elapsed time: 0.115 msecs" 6 user=> (time (let [[a b] (filt-split even? (range 100))] (nth a 3))) "Elapsed time: 413.614 msecs" 6 and is also more efficient over large sequences... (time (let

Re: filter-split

2009-03-08 Thread Laurent PETIT
It seems to me that neither filt-split nor filter-rem from e are lazy operations (one uses reduce, the other one uses recur). The version in clojurecontrib seems to preserve the original property of filter of returning a lazy sequence. My 0,02€, -- Laurent 2009/3/8 Adrian Cuthbertson > > That

Re: filter-split

2009-03-07 Thread Adrian Cuthbertson
> ...repeated creation of the ephemeral vectors isn't too expensive. With Clojure, although it looks like the immutable vectors are being re-created on each iteration, under the covers it's really just pointers being updated and the operations are (about) as efficient as a loop/recur method. > .

Re: filter-split

2009-03-07 Thread David Sletten
On Mar 7, 2009, at 6:44 PM, e wrote: > check the discussion with the subject, "time lies, even with > doall". We came up with something like the following, but some > name change change tweaks were suggested. This thing takes a pred > and a collection and returns a list of two collection

Re: filter-split

2009-03-07 Thread David Sletten
On Mar 7, 2009, at 7:17 PM, Adrian Cuthbertson wrote: > > That's the beauty of this language - there are many ways to skin > the cat! Hmmm...I'm not sure what I'll do with a skinless cat. :) > Here's a version using reduce... > > (defn filt-split [pred col] > (reduce (fn [[a b] x] (if (pred

Re: filter-split

2009-03-07 Thread Adrian Cuthbertson
That's the beauty of this language - there are many ways to skin the cat! Here's a version using reduce... (defn filt-split [pred col] (reduce (fn [[a b] x] (if (pred x) [(conj a x) b] [a (conj b x)])) [[] []] col)) (filt-split even? [1 2 3 4 5 6 7 8]) [[2 4 6 8] [1 3 5 7]] But when you look a

Re: filter-split

2009-03-07 Thread e
check the discussion with the subject, "time lies, even with doall". We came up with something like the following, but some name change change tweaks were suggested. This thing takes a pred and a collection and returns a list of two collections -- one that passes the pred, and one that fails. (d

Re: filter-split

2009-03-07 Thread Jeffrey Straszheim
There is separate in seq_utils in contrib. On Sat, Mar 7, 2009 at 11:29 PM, David Sletten wrote: > > I'm reading the Sequences chapter of Programming Clojure, and Stu > points out that split-with combines the semantics of take-while and > drop-while. But is there a function that does something s