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.



Modified text is an extract of the original Stack Overflow Documentation
Licentie onder CC BY-SA 3.0
Niet aangesloten bij Stack Overflow