tutorial online example clojure

online - clojure vs scala



¿Cuál es la “manera correcta” de verificar si una colección no está vacía? (3)

Quiero escribir una función que devolvería el verdadero booleano si la colección dada no está vacía y es falsa de lo contrario.

Yo podría hacer

defn .. (boolean (seq coll))

o

defn .. (not (empty? coll))

Como soy nuevo en clojure, al principio estaba dispuesto a ir con el # 2 (más legible), pero ¿la referencia api de clojure para el empty? dice explícitamente usar el lenguaje (seq coll) lugar de (not (empty? coll)) , tal vez para evitar la doble negación.

Quiero saber cuál es la mejor manera de comprobar si una colección no está vacía y devolver un booleano verdadero / falso.


¿El pasaje del empty? La cadena de documentos que usted mencionó significa en particular que tal nonempty? la función nunca debe ser necesaria, ni siquiera particularmente útil, porque seq siempre puede ser compatible con ella en contextos booleanos, que en código puro de Clojure puede.

No obstante, si se siente obligado a escribir una función de este tipo, le diré que me gusta más el primer enfoque. empty? está construido sobre seq todos modos, por lo que no hay que evitar llamarlo; el simple hecho de lanzar el resultado a Boolean parece más limpio que dos viajes a través de not . Para otras opciones, ver por ejemplo nil? false? (Todavía prefiero el reparto).

Por cierto, ¿por qué quieres escribir esto ...? ¿Para llamar a un método Java con un argumento boolean tal vez? En ese caso, creo que el elenco expresaría muy bien la intención.

Actualización: Un ejemplo para ilustrar el último punto:

  1. Una clase simple de Java:

    public class Foo { public static boolean foo(boolean arg) { return !arg; } }

  2. Algún código de cliente de Clojure:

    (Foo/foo nil) ; => NullPointerException (Foo/foo (boolean nil)) ; => true


Además de la excelente respuesta de Michal Marczyk, señalaré que hay una función específica que no está vacía:

http://clojure.github.io/clojure/clojure.core-api.html#clojure.core/not-empty

Pero no hace exactamente lo que pides. (Aunque funcionará en la mayoría de las situaciones).

No-vacío devuelve nil si la colección está vacía, y la colección misma si la colección no está vacía. Para las pruebas de predicado, eso funcionará bien. Si realmente necesita valores verdaderos y falsos, entonces (no (vacío? X)) es lo que está buscando.


De acuerdo con Joy of Clojure, el castigo nulo con seq es idiomático:

(defn print-seq [s] (when (seq s) (prn (first s)) (recur (rest s))))

"... el uso de seq como condición de terminación es la forma idiomática de probar si una secuencia está vacía. Si probamos [en el ejemplo anterior] solo s lugar de (seq s) , entonces no se producirá la condición de terminación incluso para colecciones vacías ... "