common-lisp
Booleanos y booleanos generalizados
Buscar..
Verdadero y falso
El símbolo especial T
representa el valor verdadero en Common Lisp, mientras que el símbolo especial NIL
representa falso :
CL-USER> (= 3 3)
T
CL-USER> (= 3 4)
NIL
Se denominan "Variables constantes" (sic!) En el estándar, ya que son variables cuyo valor no se puede modificar. Como consecuencia, no puede usar sus nombres para variables normales, como en el siguiente ejemplo, incorrecto:
CL-USER> (defun my-fun(t)
(+ t 1))
While compiling MY-FUN :
Can't bind or assign to constant T.
En realidad, uno puede considerarlas simplemente como constantes, o como símbolos autoevaluados. T
y NIL
son especiales en otros sentidos. Por ejemplo, T
también es un tipo (el supertipo de cualquier otro tipo), mientras que NIL
también es la lista vacía:
CL-USER> (eql NIL '())
T
CL-USER> (cons 'a (cons 'b nil))
(A B)
Booleanos generalizados
En realidad, cualquier valor diferente de NIL
se considera un valor verdadero en Common Lisp. Por ejemplo:
CL-USER> (let ((a (+ 2 2)))
(if a
a
"Oh my! 2 + 2 is equal to NIL!"))
4
Este hecho se puede combinar con los operadores booleanos para hacer que los programas sean más concisos. Por ejemplo, el ejemplo anterior es equivalente a:
CL-USER> (or (+ 2 2) "Oh my! 2 + 2 is equal to NIL!")
4
La macro OR
evalúa sus argumentos en orden de izquierda a derecha y se detiene tan pronto como encuentra un valor no NIL, devolviéndolo. Si todos ellos son NIL
, el valor devuelto es NIL
:
CL-USER> (or (= 1 2) (= 3 4) (= 5 6))
NIL
De manera análoga, la macro AND
evalúa sus argumentos de izquierda a derecha y devuelve el valor del último, si todos ellos se evalúan como no NIL, de lo contrario, detiene la evaluación tan pronto como encuentra NIL
, devolviéndolo:
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
Por estas razones, AND
y OR
pueden considerarse más similares a las estructuras de control de otros idiomas, en lugar de a los operadores booleanos.