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.



Modified text is an extract of the original Stack Overflow Documentation
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow