common-lisp
Booleans und generalisierte Booleans
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.