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.