OK, all submitted. The tickets are up for discussion at http://www.assembla.com/spaces/clojure/support/tickets/400-a-faster-flatten http://www.assembla.com/spaces/clojure/support/tickets/401-promote--seqable---from-contrib-
I will mail my CA in tomorrow morning. Thanks Stu and Mark! On Jul 13, 11:57 am, Stuart Halloway <stuart.hallo...@gmail.com> wrote: > Hi Cam, > > Please submit the modified version, and, if you want, create a separate > ticket for "seqable?". I would like to review the latter separately. > > Stu > > > > > Hi again, I modified my-flatten to return the empty list for sets and > > maps as core/flatten does. It doesn't seem to handle Arrays anymore > > though. I'm assuming it's because ArrayList and (int-array ...) don't > > implement Sequential. None the less should I still submit this > > modified version that behaves just like core/flatten? > > > (defn my-flatten > > [coll] > > (lazy-seq > > (when-let [coll (if (sequential? coll) (seq coll))] > > (let [x (first coll)] > > (if (sequential? x) > > (concat (my-flatten x) (my-flatten (next coll))) > > (cons x (my-flatten (next coll)))))))) > > > Might it be worth promoting "seqable?" to core? In that case flatten > > would handle pretty much everything you could throw at it like you'd > > expect. I don't speak for everyone but when I saw sequential? I > > assumed it would have the semantics that seqable? does. > > > On Jul 13, 11:04 am, Cam <dlocpuw...@gmail.com> wrote: > >> Hi Stuart, > > >> Thanks for checking that out for me! Sorry for not realizing in the > >> first place. > > >> I of course would be happy to submit a patch. Should I submit that > >> here or over on the assembla page? > > >> On Jul 13, 9:10 am, Stuart Halloway <stuart.hallo...@gmail.com> wrote: > > >>> Hi Cam, > > >>> Your tests aren't testing the interesting part without a doall. > > >>> That said, my quick tests with doall show your approach faring even > >>> better. :-) Also, I think what my-flatten does with Java arrays is > >>> intuitive (and the current flatten not so much). > > >>> A patch that preserves the semantics of the existing flatten (except for > >>> working with Java arrays) would be welcome. > > >>> Thanks! > >>> Stu > > >>>> Another flatten thread! Sorry.. > > >>>> Hello all, before I realized there was a flatten in the master branch > >>>> (and before I looked at contrib) I wrote this pretty standard code: > > >>>> (defn my-flatten [coll] > >>>> (lazy-seq > >>>> (when-let [coll (seq coll)] > >>>> (let [x (first coll)] > >>>> (if (sequential? x) > >>>> (concat (my-flatten x) (my-flatten (next coll))) > >>>> (cons x (my-flatten (next coll)))))))) > > >>>> (There's very similar versions on the boards. I'm not claiming this is > >>>> anything amazing or unique.) > > >>>> It's not as elegant as what's in core, but in my micro benchmarks (ran > >>>> on my laptop; 2.26 core 2 and 4gb ram) it seems to perform a bit > >>>> better, _especially_ in the already flattened case. It behaves just > >>>> like core/flatten except that it doesn't return an empty list when > >>>> passed a map or set, it just returns whatever you gave it but with the > >>>> top level converted to a seq. I'm pretty much a clojure noob, so are > >>>> there any hidden detractors of this implementation as opposed to the > >>>> version introduced in 1.2? > > >>>> Also, quick note, if you swap the call to sequential? with seqable? > >>>> from contrib/core, it flattens maps and sets like you'd expect as > >>>> well. > >>>> Here is how it looks > >>>> user=> (my-flatten #{1 {2 3} 4 [5 6 7 #{8 {9 10}}]}) > >>>> (1 2 3 4 5 6 7 9 10 8) > > >>>> And for the micro-benchmarks (using "sequential?"): > > >>>> user=> (time (dotimes [_ 1e7] (flatten [1 2 3 4]))) > >>>> "Elapsed time: 14,661.592 msecs" > >>>> nil > > >>>> user=> (time (dotimes [_ 1e7] (my-flatten [1 2 3 4]))) > >>>> "Elapsed time: 922.268 msecs" > >>>> nil > > >>>> user=> (time (dotimes [_ 1e7] (flatten [1 [2 [3 [4 [5 [6 [7 [8] > >>>> [[[9]]] 10 [11] 12 [13 14 [15]]]]]]]]]))) > >>>> "Elapsed time: 18,147.959 msecs" > >>>> nil > > >>>> user=> (time (dotimes [_ 1e7] (my-flatten [1 [2 [3 [4 [5 [6 [7 [8] > >>>> [[[9]]] 10 [11] 12 [13 14 [15]]]]]]]]]))) > >>>> "Elapsed time: 6,088.914 msecs" > >>>> nil > > >>>> user=> (time (dotimes [_ 1e7] (flatten [[1 2 3 4 5 6 7 8 9 10]]))) > >>>> "Elapsed time: 11,696.693 msecs" > >>>> nil > > >>>> user=> (time (dotimes [_ 1e7] (my-flatten [[1 2 3 4 5 6 7 8 9 10]]))) > >>>> "Elapsed time: 1,533.983 msecs" > >>>> nil > > >>>> Thoughts? > > >>>> -- > >>>> 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 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 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