一个 if
表达式可能有一个可选的第三个参数,称为 else-部分,用于当真假测试返回 false 时的情况。当这种情况发生时,整个 if
表达式的第二个参数或者 then-部分 不会 被评估,而第三个参数或 else-部分 会 被评估。你可以将其看作是决策的“如果天气温暖且晴朗,则去海滩,否则读一本书”的多云日备选方案。
在Lisp代码中并没有写下单词 "else";if
表达式的 else-部分在 then-部分之后。在书写的Lisp中,else-部分通常写在自己的一行上,并且比 then-部分的缩进少:
(if 真假测试 真时执行的动作 假时执行的动作)
例如,下面的 if
表达式在通常的情况下,当你对其进行求值时,会打印消息 ‘4不大于5!’:
(if (> 4 5) ; if-部分 (message "4 falsely greater than 5!") ; then-部分 (message "4 is not greater than 5!")) ; else-部分
请注意,不同缩进级别使得很容易区分 then-部分 和 else-部分。(GNU Emacs 有几个命令可以自动正确缩进 if
表达式。See GNU Emacs Helps You Type Lists.)
我们可以通过在 type-of-animal
函数中加入一个 else 部分来扩展它,只需在 if
表达式中加入一个额外的部分即可。
如果你评估以下版本的 type-of-animal
函数定义以安装它,然后评估两个后续表达式,将不同的参数传递给函数,你就能看到这样做的后果。
(defun type-of-animal (characteristic) ; 第二个版本。
"根据 CHARACTERISTIC 在回显区域打印消息。
如果 CHARACTERISTIC 是字符串 \"fierce\",
则警告是一只老虎;否则说它不凶猛。"
(if (equal characteristic "fierce")
(message "这是一只老虎!")
(message "它不凶猛!")))
(type-of-animal "fierce") (type-of-animal "striped")
当你评估 (type-of-animal "fierce")
时,你将在回显区域看到以下消息打印出来:"这是一只老虎!"
;但是当你评估 (type-of-animal "striped")
时,你将看到 "它不凶猛!"
。
(当然,如果 characteristic 是 "ferocious"
,则将打印消息 "它不凶猛!"
;这可能会产生误导!在编写代码时,你需要考虑到 if
可能会测试到这样的参数,并相应地编写你的程序。)