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