On Sun, Jan 16, 2011 at 6:22 AM, Jürgen Hötzel <juer...@hoetzel.info> wrote:
> Hi,
> I came across this issue while implementing a lazy, efficient flatten that
> also uses the whole sequence abstraction (flatten java arrays....).
> The problem with (seq x) is, that it will throw an Exception if called on
> something, that cannot be coerced to sequence, so I just used sequencial?
> like the current implementation of flatten:
> (defn my-flatten [coll]
>   (mapcat (fn [p] (if (sequential? (first p)) (mapcat my-flatten p) p))
>           (partition-by sequential? coll)))
> But this will obviously fail  to flatten anything that doesn't
> implement clojure.lang.Sequential (like java.arrays).

Unfortunately, right now that's a big gap in the clojure.core
functionality. It's quick to fix, though the fix is a bit of a hack as
it uses the exception-throwing behavior of (seq x). On the plus side
this guarantees that it meets its contract.

(defn seqable? [x]
  (try (seq x) (catch Exception _)))

(def m-seq seqable?)

(defn seqable-ns? [x]
  (if-not (instance? java.lang.String x) (seqable? x)))

(def m-seq-ns seqable-ns?)

Anything seqable is returned unchanged by seqable? and m-seq, which
return nil rather than throw if the thing is not seqable. The two
names for the same function are just to improve code readability:
seqable? for use as a predicate and m-seq for uses like

(if-let [x (m-seq foo)] (do-something-with x))

The -ns versions differ only in that they pretend Strings aren't
seqable, for those fairly common cases where you want to treat strings
as atomic rather than as character sequences; for instance if you're
probing a data structure made of nested colls and wish to regard whole
strings as leaf nodes in the traversal instead of their individual
characters.

-- 
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

Reply via email to