I definitely like this version a little better. If you change the else of the if to be just (list), it returns the empty list just as core/ flatten does. Mind if I update the ticket with this patch?
On Jul 14, 1:56 pm, miner <[email protected]> wrote: > I think it's worthwhile to have a faster flatten even if it doesn't > look as elegant as the current implementation. You could do a bit of > refactoring and save yourself a call to sequential? since the > recursive calls are guaranteed to have seqs (as a result of next). > > Also, I'd prefer flatten to return the argument if it isn't > sequential? so for example, (flatten 10) ==> 10. I think it would be > less likely to give mysterious results, especially with mistaken > arguments. I understand that the current flatten for 1.2 beta doesn't > do this -- I'm just throwing in another suggestion after playing with > it for a while. > > Here's my suggestion: > > (defn fl1 "faster flatten" [coll] > (letfn [(flcoll [coll] > (lazy-seq > (when-let [c (seq coll)] > (let [x (first c) > nxt (flcoll (next c))] > (if (sequential? x) > (concat (flcoll x) nxt) > (cons x nxt))))))] > (if (sequential? coll) (flcoll coll) coll))) -- You received this message because you are subscribed to the Google Groups "Clojure" group. To post to this group, send email to [email protected] Note that posts from new members are moderated - please be patient with your first post. To unsubscribe from this group, send email to [email protected] For more options, visit this group at http://groups.google.com/group/clojure?hl=en
