2010-07-13 14 views
10

En Common Lisp usa la función (nula x) para verificar listas vacías y valores nulos.manera idiomática de reemplazar (función x nula) del ceceo común en clojure

más lógicamente esto se correlaciona con

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

En clojure. ¿Alguien puede sugerir una forma más idiomática de hacerlo en Clojure?

+1

En Lisp, 'NIL' y'() '(la lista vacía) son una misma cosa. Su fragmento de código es un pleonasmo. – Svante

+4

No en Clojure: '(= '() nil) => falso'. En otros Lisps, esto es cierto. – Isaac

+6

Svante: Su afirmación podría no ser cierta en Clojure pero tengo una nueva palabra favorita. – Ken

Respuesta

16

Para obtener el mismo resultado para una lista vacía en Clojure que en Common Lisp, use la función empty?. Esta función se encuentra en la biblioteca central: no se necesitan importaciones.

También es un predicado, y el sufijo con un ?, por lo que es un poco más claro qué es exactamente lo que está haciendo en el código.

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

Como ya se señaló j-g Fausto, seq puede usarse para un efecto similar.

+0

Su respuesta es mejor, ya que también funciona con vectores, mapas, cadenas, etc., sin convertirlos a seqs. Supongo que el enfoque seq es adecuado si tienes un argumento de tipo desconocido y quieres operar en un seq. –

+3

j-g-faustus: Deseo. El defn es '(defn empty? [Coll] (not (seq coll)))'. – naiad

+0

Hah, wow, no puedo creer que nos hayamos perdido eso. Dos años después, pero definitivamente es bueno saberlo y tenerlo aquí. – Isaac

10

SEC también sirve como prueba para el final, ya idiomática

(when (seq coll) 
    ...) 

De clojure.org lazy

Funciona porque (seq nil) y (seq()) tanto la rentabilidad nula.

Y desde nil significa false, no necesita una prueba nula explícita.

Cuestiones relacionadas