common-lisp
Booleany i uogólnione booleany
Szukaj…
Prawda i fałsz
Specjalny symbol T
reprezentuje wartość true w Common Lisp, podczas gdy specjalny symbol NIL
reprezentuje false :
CL-USER> (= 3 3)
T
CL-USER> (= 3 4)
NIL
Są one nazywane w standardzie „Zmiennymi stałymi” (sic!), Ponieważ są to zmienne, których wartości nie można modyfikować. W związku z tym nie można używać ich nazw dla normalnych zmiennych, jak w poniższym niepoprawnym przykładzie:
CL-USER> (defun my-fun(t)
(+ t 1))
While compiling MY-FUN :
Can't bind or assign to constant T.
W rzeczywistości można je traktować po prostu jako stałe lub symbole samooceny. T
i NIL
są również specjalnościami w innych zmysłach. Na przykład T
jest również typem (nadtypem dowolnego innego typu), podczas gdy NIL
jest również pustą listą:
CL-USER> (eql NIL '())
T
CL-USER> (cons 'a (cons 'b nil))
(A B)
Uogólnione booleany
W rzeczywistości każda wartość inna niż NIL
jest uważana za prawdziwą wartość w Common Lisp. Na przykład:
CL-USER> (let ((a (+ 2 2)))
(if a
a
"Oh my! 2 + 2 is equal to NIL!"))
4
Fakt ten można połączyć z operatorami logicznymi, aby programy były bardziej zwięzłe. Na przykład powyższy przykład jest równoważny z:
CL-USER> (or (+ 2 2) "Oh my! 2 + 2 is equal to NIL!")
4
Makro OR
ocenia swoje argumenty w kolejności od lewej do prawej i zatrzymuje się, gdy tylko znajdzie wartość inną niż NIL, zwracając ją. Jeśli wszystkie mają wartość NIL
, zwracana jest wartość NIL
:
CL-USER> (or (= 1 2) (= 3 4) (= 5 6))
NIL
Analogicznie makro AND
ocenia swoje argumenty od lewej do prawej i zwraca wartość ostatniego, jeśli wszystkie zostaną ocenione jako inne niż NIL, w przeciwnym razie zatrzymuje ocenę, jak tylko znajdzie NIL
, zwracając ją:
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
Z tych powodów AND
i OR
można uznać za bardziej podobne do struktur kontrolnych innych języków, niż do operatorów logicznych.