2.5 真与假 (Truth)
在 Common Lisp 里,符号 t
是表示逻辑 真
的缺省值。与 nil
相同, t
也是对自身求值的。如果实参是一个列表,则函数 listp
返回 真
:
> (listp '(a b c))
T
函数的返回值将会被解释成逻辑 真
或逻辑 假
时,则称此函数为谓词(predicate)。在 Common Lisp 里,谓词的名字通常以 p
结尾。
逻辑 假
在 Common Lisp 里,用 nil
,即空表来表示。如果我们传给 listp
的实参不是列表,则返回 nil
。
> (listp 27)
NIL
由于 nil
在 Common Lisp 里扮演两个角色,如果实参是一个空表,则函数 null
返回 真
。
> (null nil)
T
而如果实参是逻辑 假
,则函数 not
返回 真
:
> (not nil)
T
null
与 not
做的是一样的事情。
在 Common Lisp 里,最简单的条件式是 if
。通常接受三个实参:一个 test 表达式,一个 then 表达式和一个 else 表达式。若 test
表达式求值为逻辑 真
,则对 then
表达式求值,并返回这个值。若 test
表达式求值为逻辑 假
,则对 else
表达式求值,并返回这个值:
> (if (listp '(a b c))
(+ 1 2)
(+ 5 6))
3
> (if (listp 27)
(+ 1 2)
(+ 5 6))
11
与 quote
相同, if
是特殊的操作符。不能用函数来实现,因为实参在函数调用时永远会被求值,而 if
的特点是,只有最后两个实参的其中一个会被求值。 if
的最后一个实参是选择性的。如果忽略它的话,缺省值是 nil
:
> (if (listp 27)
(+ 1 2))
NIL
虽然 t
是逻辑 真
的缺省表示法,任何非 nil
的东西,在逻辑的上下文里通通被视为 真
。
> (if 27 1 2)
1
逻辑操作符 and
和 or
与条件式类似。两者都接受任意数量的实参,但仅对能影响返回值的几个实参求值。如果所有的实参都为 真
(即非 nil
),那么 and
会返回最后一个实参的值:
> (and t (+ 1 2))
3
如果其中一个实参为 假
,那之后的所有实参都不会被求值。 or
也是如此,只要碰到一个为 真
的实参,就停止对之后所有的实参求值。
以上这两个操作符称为宏。宏和特殊的操作符一样,可以绕过一般的求值规则。第十章解释了如何编写你自己的宏。