common-lisp
Booleans e Booleans generalizzati
Ricerca…
Vero e falso
Il simbolo speciale T
rappresenta il valore true in Common Lisp, mentre il simbolo speciale NIL
rappresenta false :
CL-USER> (= 3 3)
T
CL-USER> (= 3 4)
NIL
Si chiamano "Variabili Costanti" (sic!) Nello standard, poiché sono variabili il cui valore non può essere modificato. Di conseguenza, non è possibile utilizzare i loro nomi per le variabili normali, come nell'esempio seguente, errato:
CL-USER> (defun my-fun(t)
(+ t 1))
While compiling MY-FUN :
Can't bind or assign to constant T.
In realtà, si possono considerare semplicemente come costanti o come simboli auto-valutati. T
e NIL
sono speciali anche in altri sensi. Ad esempio, T
è anche un tipo (il supertipo di qualsiasi altro tipo), mentre NIL
è anche la lista vuota:
CL-USER> (eql NIL '())
T
CL-USER> (cons 'a (cons 'b nil))
(A B)
Booleani generalizzati
In realtà qualsiasi valore diverso da NIL
è considerato un valore vero in Common Lisp. Per esempio:
CL-USER> (let ((a (+ 2 2)))
(if a
a
"Oh my! 2 + 2 is equal to NIL!"))
4
Questo fatto può essere combinato con gli operatori booleani per rendere i programmi più concisi. Ad esempio, l'esempio sopra è equivalente a:
CL-USER> (or (+ 2 2) "Oh my! 2 + 2 is equal to NIL!")
4
La macro OR
valuta i suoi argomenti in ordine da sinistra a destra e si ferma non appena trova un valore non NIL, restituendolo. Se tutti sono NIL
, il valore restituito è NIL
:
CL-USER> (or (= 1 2) (= 3 4) (= 5 6))
NIL
Analogamente, la macro AND
valuta i suoi argomenti da sinistra a destra e restituisce il valore dell'ultimo, se tutti sono valutati su non-NIL, altrimenti arresta la valutazione non appena trova NIL
, restituendola:
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
Per questi motivi, AND
e OR
possono essere considerati più simili alle strutture di controllo di altri linguaggi, piuttosto che agli operatori booleani.