What is the correct "clojure way" to check if a collection is non empty
According to Joy of Clojure, nil punning with seq
is idiomatic:
(defn print-seq [s]
(when (seq s)
(prn (first s))
(recur (rest s))))
"...the use of seq
as a terminating condition is the idiomatic way to test whether a sequence is empty. If we tested [in the above example] just s
instead of (seq s)
, then the terminating condition wouldn't occur even for empty collections..."
The passage from empty?
's docstring which you mentioned means in particular that such a nonempty?
function should never be necessary, or even particularly useful, because seq
can always stand in for it in Boolean contexts, which in pure Clojure code it can.
If you feel compelled to write such a function nonetheless, I'll say that I like the first approach better. empty?
is built on seq
anyway, so there's no avoiding calling it; just casting the result to Boolean seems cleaner than two trips through not
. For other options, see e.g. nil?
, false?
(I still prefer the cast).
Incidentally, why do you want to write this...? For calling a Java method with a boolean
argument perhaps? In that case, I think the cast would express the intention nicely.
Update: An example to illustrate the latter point:
A simple Java class:
public class Foo { public static boolean foo(boolean arg) { return !arg; } }
Some Clojure client code:
(Foo/foo nil) ; => NullPointerException (Foo/foo (boolean nil)) ; => true