if 详解 ¶Lisp 中的 if 表达式不使用单词“then”;
条件测试与执行语句分别是首个元素为 if 的列表的第二个和第三个元素。
尽管如此,if 表达式的测试部分通常被称为条件部分(if-part),
第二个参数通常被称为执行部分(then-part)。
此外,编写 if 表达式时,真假判断条件通常与符号 if 写在同一行,
而条件为真时执行的语句(执行部分)则写在第二行及后续行。
这样能让 if 表达式更易阅读。
(if true-or-false-test
action-to-carry-out-if-test-is-true)
真假判断条件是一个会被 Lisp 解释器求值的表达式。
下面是一个可以按常规方式求值的示例。测试条件为数字 5 是否大于数字 4。 由于结果为真,会打印消息 ‘5 is greater than 4!’。
(if (> 5 4) ; if-part (message "5 is greater than 4!")) ; then-part
(函数 > 用于判断第一个参数是否大于第二个参数,
若是则返回真。)
当然,在实际使用中,if 表达式中的测试条件
不会像 (> 5 4) 那样固定不变。
相反,测试中使用的至少一个变量会绑定到一个预先未知的值。
(如果值是预先确定的,就无需进行测试了!)
例如,该值可能绑定到函数定义的某个参数。
在下面的函数定义中,动物特征是传递给函数的值。
若绑定到 characteristic 的值为 "fierce",
则打印消息 ‘It is a tiger!’;否则返回 nil。
(defun type-of-animal (characteristic)
"Print message in echo area depending on CHARACTERISTIC.
If the CHARACTERISTIC is the string \"fierce\",
then warn of a tiger."
(if (equal characteristic "fierce")
(message "It is a tiger!")))
如果你正在 GNU Emacs 中阅读本文档, 可以按常规方式对该函数定义求值,将其加载到 Emacs 中, 然后对下面两个表达式求值,查看运行结果:
(type-of-animal "fierce") (type-of-animal "striped")
对 (type-of-animal "fierce") 求值时,
回显区会打印消息:"It is a tiger!";
对 (type-of-animal "striped") 求值时,
回显区会打印 nil。