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.



Modified text is an extract of the original Stack Overflow Documentation
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow