2010-07-13 6 views
10

In Common Lisp verwenden Sie die (Null x) -Funktion, um nach leeren Listen und Nullwerten zu suchen.idiomatische Methode zum Ersetzen (Null x) -Funktion von gewöhnlichem Lisp in clojure

meisten logisch abbildet, dies zu

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

In clojure. Kann jemand einen eher idiomatischen Weg vorschlagen, es in Clojure zu tun?

+1

In Lisp sind 'NIL' und'() '(die leere Liste) ein und dieselbe Sache. Ihr Code-Snippet ist ein Pleonasmus. – Svante

+4

Nicht in Clojure: '(= '() nil) => false'. In anderen Lisps ist dies der Fall. – Isaac

+6

Svante: Deine Aussage ist in Clojure vielleicht nicht wahr, aber ich habe ein neues Lieblingswort. – Ken

Antwort

16

Um das gleiche Ergebnis für eine leere Liste in Clojure wie in Common Lisp zu erhalten, verwenden Sie die empty? Funktion. Diese Funktion befindet sich in der Kernbibliothek: Es sind keine Importe erforderlich.

Es ist auch ein Prädikat, und mit einem ? suffixed, es ein wenig klarer zu machen, was genau sind Sie in den Code zu tun.

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

Als j-g faustus bereits erwähnt, seq kann für eine ähnliche Wirkung verwendet werden.

+0

Ihre Antwort ist besser, da sie auch mit Vektoren, Karten, Strings usw. funktioniert, ohne sie in Seqs umzuwandeln. Ich nehme an, der Seq-Ansatz ist geeignet, wenn Sie ein Argument unbekannter Art haben und auf einem Seq operieren wollen. –

+3

j-g-faustus: Ich wünschte. Das Defn ist '(defn leer? [Coll] (nicht (seq coll)))'. – naiad

+0

Hah, wow, kann nicht glauben, dass wir das vermisst haben. Zwei Jahre später, aber definitiv gut zu wissen und hier zu haben. – Isaac

10

ff dient auch als Test für Ende, bereits idiomatische

(when (seq coll) 
    ...) 

Von clojure.org lazy

Es funktioniert, weil (seq nil) und (seq()) beide Rückkehr gleich Null.

Und seit nil bedeutet false, Sie brauchen keinen expliziten Null-Test.