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.



Modified text is an extract of the original Stack Overflow Documentation
Licenciado bajo CC BY-SA 3.0
No afiliado a Stack Overflow