2011-11-21 16 views
11

Qual è il modo migliore per testare un vettore vuoto in Clojure? Mi aspettavo che questo stampasse false:Come testare un vettore vuoto in Clojure

(if [] "true" "false") 

ma non è così. Si tratta di:

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

ma è ingombrante - esiste un costrutto più breve?

+0

'[]' è il vettore vuoto, non la lista vuota, non è vero? – Svante

+0

@Svante si. Sospetto che Kevin voglia solo testare una collezione vuota in generale, ma sta usando un vettore per il suo esempio mentre dice la lista. – amalloy

+0

Sei corretto; Ho modificato la domanda. Tuttavia, se si cerca un problema con la "lista vuota dei test del clojure", si potrebbe voler trovare questa domanda ... –

risposta

27

Usa predicato di serie (empty? list)

+7

Inoltre si dovrebbe usare (lista seq) quando si tenta di determinare se l'elenco non è vuoto. – nickmbailey

+0

Attenzione che in un modo o nell'altro considererai 'nil' una sequenza vuota. '(vuoto? nil); => true' e '(seq nil); => nil'. In alcuni dei miei casi non si trattava di un comportamento desiderato, quindi andavo con '# (e% (vuoto?%)' Per verificare se qualcosa è "sequenza e vuoto". – foki

0

Oltre alla risposta di Mishadoff (che è più leggibile), si potrebbe anche confrontare con un elenco vuoto se stesso (e salvare due caratteri di lunghezza):

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

Hmmm ... Continuo a pensare che preferisco la risposta di Mishadoff.

+0

Capito anche che se zero viene valutato come falso, si può semplicemente usare (contare []). Ancora vuoto? è la strada da percorrere –

+5

In clojure solo 'nil' e' false' costituiscono falsità logica. Zero is truthy – Scott

+1

Questo non è un buon approccio. a(), ma dovrebbe essere trattato come una lista vuota. – amalloy

16

Il modo più comune che vedo nel codice Clojure per controllare una lista non vuota è utilizzare seq. Questo restituisce zero se la raccolta è vuota o seq oggetto valido altrimenti.

Esempio di utilizzo:

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

È anche possibile utilizzare empty? per testare il contrario (cioè prova per un insieme vuoto). Si noti che vuoto? è implementato nel codice sorgente del clojure come (not (seq coll)) in modo da poter essere sicuri con la consapevolezza che i due approcci sono fondamentalmente equivalenti.

Problemi correlati