2010-07-13 7 views
10

In Common Lisp si utilizza la funzione (null x) per verificare la presenza di liste vuote e valori nulli.modo idiomatico per sostituire (null x) la funzione da common lisp in clojure

La maggior parte logicamente questo mappe per

(or (nil? x) (= '() x)) 

In clojure. Qualcuno può suggerire un modo più idiomatico di farlo in Clojure?

+1

In Lisp, 'NIL' e'() '(la lista vuota) sono la stessa cosa. Il tuo snippet di codice è un pleonasma. – Svante

+4

Non in Clojure: '(= '() nil) => false'. In altri Lisps, questo è vero. – Isaac

+6

Svante: la tua affermazione potrebbe non essere vera in Clojure ma ho una nuova parola preferita. – Ken

risposta

16

Per ottenere lo stesso risultato per un elenco vuoto in Clojure come in Common Lisp, utilizzare la funzione empty?. Questa funzione è nella libreria principale: non sono necessarie importazioni.

Esso è anche un predicato, e con un suffisso di ?, rendendolo un po 'più chiaro che cosa esattamente si sta facendo nel codice.

=> (empty? '()) 
true 
=> (empty? '(1 2)) 
false 
=> (empty? nil) 
true 

Come j-g faustus già notato, seq può essere utilizzato per un effetto simile.

+0

La tua risposta è migliore, poiché funziona anche con vettori, mappe, stringhe ecc. Senza convertirli in seq. Suppongo che l'approccio seq sia adatto se si ha un argomento di tipo sconosciuto e si vuole operare su un seq. –

+3

j-g-faustus: Vorrei. Il defn è '(defn vuoto? [Coll] (not (seq coll)))'. – naiad

+0

Hah, wow, non posso credere che ci siamo persi. Due anni dopo, ma sicuramente buono da sapere e avere qui. – Isaac

10

seguenti serve anche come prova per la fine, già idiomatica

(when (seq coll) 
    ...) 

Da clojure.org lazy

Funziona perché (seq nil) e (seq()) sia nullo ritorno.

E dal nil significa false, non è necessario un test nil esplicito.