common-lisp
Booleans och generaliserade booleans
Sök…
Sant och falskt
Specialsymbolen T
representerar värdet sant i Common Lisp, medan specialsymbolen NIL
representerar falskt :
CL-USER> (= 3 3)
T
CL-USER> (= 3 4)
NIL
De kallas ”Konstantvariabler” (sic!) I standarden, eftersom de är variabler vars värde inte kan modifieras. Som en konsekvens kan du inte använda deras namn för normala variabler, som i följande, felaktiga exempel:
CL-USER> (defun my-fun(t)
(+ t 1))
While compiling MY-FUN :
Can't bind or assign to constant T.
Egentligen kan man betrakta dem helt enkelt som konstanter eller som självutvärderade symboler. T
och NIL
är specialerbjudanden också i andra sinnen. Till exempel är T
också en typ (supertypen av någon annan typ), medan NIL
är den tomma listan:
CL-USER> (eql NIL '())
T
CL-USER> (cons 'a (cons 'b nil))
(A B)
Generaliserade Booleans
I själva verket anses alla värden som skiljer sig från NIL
vara ett verkligt värde i Common Lisp. Till exempel:
CL-USER> (let ((a (+ 2 2)))
(if a
a
"Oh my! 2 + 2 is equal to NIL!"))
4
Detta faktum kan kombineras med de booleska operatörerna för att göra program mer kortfattade. Exemplet ovan motsvarar till exempel:
CL-USER> (or (+ 2 2) "Oh my! 2 + 2 is equal to NIL!")
4
Makroen OR
utvärderar sina argument i ordning från vänster till höger och stannar så snart den hittar ett värde som inte är NIL och returnerar det. Om alla är NIL
är det returnerade värdet NIL
:
CL-USER> (or (= 1 2) (= 3 4) (= 5 6))
NIL
Analogt utvärderar makro AND
sina argument från vänster till höger och returnerar värdet på det sista, om alla utvärderas till icke-NIL, annars stoppar utvärderingen så snart den hittar NIL
och returnerar den:
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
Av dessa skäl kan AND
och OR
anses vara mer lik kontrollstrukturer på andra språk, snarare än booleska operatörer.