2011-11-21 10 views
11

¿Cuál es la mejor manera de probar un vector vacío en Clojure? Esperaba que esto imprimiera falso:Cómo probar un vector vacío en Clojure

(if [] "true" "false") 

pero no es así. Esto hace:

(if (> (count []) 0) "true" "false") 

pero es difícil de manejar - ¿hay una construcción más corta?

+0

'[]' es el vector vacío, no la lista vacía, ¿no es así? – Svante

+0

@Svante sí. Sospecho que Kevin solo quiere probar una colección vacía en general, pero está usando un vector para su ejemplo mientras dice la lista. – amalloy

+0

Tiene razón; Edité la pregunta. Sin embargo, se encuentra con un problema, porque las personas que buscan en google "lista vacía de prueba de clojure" pueden querer encontrar esta pregunta ... –

Respuesta

27

uso de predicados estándar (empty? list)

+7

Además, debe usar (lista seq) cuando intente determinar si la lista no está vacía. – nickmbailey

+0

Ten en cuenta que de una forma u otra considerarás 'nil' como una secuencia vacía. '(vacío? nil); => true' y '(seq nil); => nil'. En algunos de mis casos no era el comportamiento deseado, así que iría con '# (y% (vacío?%)' Para probar si algo es "secuencia y vacío". – foki

0

Además de la respuesta de Mishadoff (que es más fácil de leer), también se puede comparar con una lista vacía en sí (y ahorrar dos caracteres de longitud):

(if (=() []) "true" "false") 

Hmmm ... Sigo pensando que prefiero la respuesta de Mishadoff.

+0

Acabo de darme cuenta de que si cero es falso, solo podría usar (count []). Still empty? is the way to go. –

+5

En clojure solo 'nil' y' false' constituyen falsedad lógica. Cero es verdad. – Scott

+1

Este no es un buen enfoque. nil no es igual a(), pero debe tratarse como una lista vacía. – amalloy

16

La forma más común que veo en el código de Clojure para buscar una lista no vacía es usar seq. Esto devuelve nil si la colección está vacía, o un objeto seq válido en caso contrario.

Ejemplo de uso:

(seq []) 
=> nil 

(seq nil) 
=> nil 

(seq [1 2 3]) 
=> (1 2 3)   ;; note this is a "true value" 

(if (seq [1 4 6]) "true" "false") 
=> "true" 

(if (seq []) "true" "false") 
=> "false" 

También puede utilizar empty? para probar la opuesta (test es decir, para un conjunto vacío). Tenga en cuenta que vacio? se implementa en el código fuente de clojure como (not (seq coll)) por lo que puede estar seguro sabiendo que los dos enfoques son fundamentalmente equivalentes.

Cuestiones relacionadas