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