2.5 真与假 (Truth)

在 Common Lisp 里,符号 t 是表示逻辑 的缺省值。与 nil 相同, t 也是对自身求值的。如果实参是一个列表,则函数 listp 返回

  1. > (listp '(a b c))
  2. T

函数的返回值将会被解释成逻辑 或逻辑 时,则称此函数为谓词(predicate)。在 Common Lisp 里,谓词的名字通常以 p 结尾。

逻辑 在 Common Lisp 里,用 nil ,即空表来表示。如果我们传给 listp 的实参不是列表,则返回 nil

  1. > (listp 27)
  2. NIL

由于 nil 在 Common Lisp 里扮演两个角色,如果实参是一个空表,则函数 null 返回

  1. > (null nil)
  2. T

而如果实参是逻辑 ,则函数 not 返回

  1. > (not nil)
  2. T

nullnot 做的是一样的事情。

在 Common Lisp 里,最简单的条件式是 if 。通常接受三个实参:一个 test 表达式,一个 then 表达式和一个 else 表达式。若 test 表达式求值为逻辑 ,则对 then 表达式求值,并返回这个值。若 test 表达式求值为逻辑 ,则对 else 表达式求值,并返回这个值:

  1. > (if (listp '(a b c))
  2. (+ 1 2)
  3. (+ 5 6))
  4. 3
  5. > (if (listp 27)
  6. (+ 1 2)
  7. (+ 5 6))
  8. 11

quote 相同, if 是特殊的操作符。不能用函数来实现,因为实参在函数调用时永远会被求值,而 if 的特点是,只有最后两个实参的其中一个会被求值。 if 的最后一个实参是选择性的。如果忽略它的话,缺省值是 nil

  1. > (if (listp 27)
  2. (+ 1 2))
  3. NIL

虽然 t 是逻辑 的缺省表示法,任何非 nil 的东西,在逻辑的上下文里通通被视为

  1. > (if 27 1 2)
  2. 1

逻辑操作符 andor 与条件式类似。两者都接受任意数量的实参,但仅对能影响返回值的几个实参求值。如果所有的实参都为 (即非 nil ),那么 and 会返回最后一个实参的值:

  1. > (and t (+ 1 2))
  2. 3

如果其中一个实参为 ,那之后的所有实参都不会被求值。 or 也是如此,只要碰到一个为 的实参,就停止对之后所有的实参求值。

以上这两个操作符称为。宏和特殊的操作符一样,可以绕过一般的求值规则。第十章解释了如何编写你自己的宏。