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.