common-lisp
Booleans and Generalized Booleans
Zoeken…
Goed en fout
Het speciale symbool T
vertegenwoordigt de waarde true in Common Lisp, terwijl het speciale symbool NIL
false vertegenwoordigt:
CL-USER> (= 3 3)
T
CL-USER> (= 3 4)
NIL
Ze worden in de standaard "constante variabelen" (sic!) Genoemd, omdat het variabelen zijn waarvan de waarde niet kan worden gewijzigd. Bijgevolg kunt u hun namen niet gebruiken voor normale variabelen, zoals in het volgende, onjuiste voorbeeld:
CL-USER> (defun my-fun(t)
(+ t 1))
While compiling MY-FUN :
Can't bind or assign to constant T.
Eigenlijk kun je ze eenvoudig als constanten beschouwen, of als zelf-geëvalueerde symbolen. T
en NIL
zijn ook specials in andere zintuigen. T
is bijvoorbeeld ook een type (het supertype van een ander type), terwijl NIL
ook de lege lijst is:
CL-USER> (eql NIL '())
T
CL-USER> (cons 'a (cons 'b nil))
(A B)
Gegeneraliseerde Booleans
Eigenlijk wordt elke andere waarde dan NIL
beschouwd als een echte waarde in Common Lisp. Bijvoorbeeld:
CL-USER> (let ((a (+ 2 2)))
(if a
a
"Oh my! 2 + 2 is equal to NIL!"))
4
Dit feit kan worden gecombineerd met de booleaanse operatoren om programma's beknopter te maken. Het bovenstaande voorbeeld is bijvoorbeeld gelijk aan:
CL-USER> (or (+ 2 2) "Oh my! 2 + 2 is equal to NIL!")
4
De macro OR
evalueert zijn argumenten in volgorde van links naar rechts en stopt zodra hij een niet-NIL-waarde vindt en retourneert deze. Als ze allemaal NIL
, is de geretourneerde waarde NIL
:
CL-USER> (or (= 1 2) (= 3 4) (= 5 6))
NIL
Analoog evalueert de macro AND
zijn argumenten van links naar rechts en retourneert de waarde van de laatste, als ze allemaal worden geëvalueerd naar niet-NIL, anders stopt de evaluatie zodra deze NIL
vindt en retourneert deze:
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
Om deze redenen kunnen AND
en OR
worden beschouwd als meer vergelijkbaar met besturingsstructuren van andere talen, in plaats van met booleaanse operatoren.