Suche…


Richtig und falsch

Das Sonderzeichen T für den Wert " True" in Common Lisp, während das Sonderzeichen NIL für " Falsch" steht :

CL-USER> (= 3 3)
T
CL-USER> (= 3 4)
NIL

Sie werden im Standard als "konstante Variablen" (sic!) Bezeichnet, da es sich um Variablen handelt, deren Wert nicht geändert werden kann. Daher können Sie ihre Namen nicht für normale Variablen verwenden, wie im folgenden, fehlerhaften Beispiel:

CL-USER> (defun my-fun(t)
           (+ t 1))
While compiling MY-FUN :
Can't bind or assign to constant T.

Eigentlich kann man sie einfach als Konstanten oder als selbstbewertete Symbole betrachten. T und NIL sind auch in anderer NIL Specials. Zum Beispiel ist T auch ein Typ (der Supertyp eines anderen Typs), während NIL auch die leere Liste ist:

CL-USER> (eql NIL '())
T
CL-USER> (cons 'a (cons 'b nil))
(A B)

Generalisierte Boolesche

Tatsächlich wird jeder von NIL abweichende Wert in Common Lisp als wahrer Wert betrachtet. Zum Beispiel:

CL-USER> (let ((a (+ 2 2)))
           (if a
               a
               "Oh my! 2 + 2 is equal to NIL!"))
4

Diese Tatsache kann mit den booleschen Operatoren kombiniert werden, um Programme übersichtlicher zu gestalten. Das obige Beispiel ist zum Beispiel äquivalent zu:

CL-USER> (or (+ 2 2) "Oh my! 2 + 2 is equal to NIL!")
4

Das Makro OR wertet seine Argumente in der Reihenfolge von links nach rechts aus und stoppt, sobald es einen Nicht-NIL-Wert findet, und gibt diesen zurück. Wenn alle NIL , ist der zurückgegebene Wert NIL :

CL-USER> (or (= 1 2) (= 3 4) (= 5 6))
NIL

Analog wertet das Makro AND seine Argumente von links nach rechts und gibt den Wert des letzten zurück, wenn alle von ihnen als Nicht-NIL ausgewertet werden. Andernfalls wird die Bewertung NIL , sobald NIL wird.

CL-USER> (let ((a 2)
               (b 3))
           (and (/= b 0) (/ a b)))
2/3
CL-USER> (let ((a 2)
               (b 0))
           (and (/= b 0) (/ a b)))
NIL

Aus diesen Gründen können AND und OR eher Kontrollstrukturen anderer Sprachen als booleschen Operatoren ähneln.



Modified text is an extract of the original Stack Overflow Documentation
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow