3.7.1 详细介绍 type-of-animal 函数

让我们详细看一下 type-of-animal 函数。

type-of-animal 函数的定义是通过填充两个模板而完成的,一个用于整个函数定义,另一个用于 if 表达式。

每个非交互式函数的模板如下:

(defun name-of-function (argument-list)
  "documentation…"
  body…)

符合此模板的函数部分如下:

(defun type-of-animal (characteristic)
  "根据 CHARACTERISTIC 在回显区域打印消息。
如果 CHARACTERISTIC 是字符串 \"fierce\",则警告可能是老虎。"
  body: the if expression)

函数的名称是 type-of-animal;它接受一个参数的值。参数列表后面是多行文档字符串。在示例中包含文档字符串是一个良好的习惯,建议为每个函数定义都编写文档字符串。函数定义的主体由 if 表达式组成。

if 表达式的模板如下:

(if true-or-false-test
    action-to-carry-out-if-the-test-returns-true)

type-of-animal 函数中,if 的代码如下:

(if (equal characteristic "fierce")
    (message "它是一只老虎!"))

在这里,true-or-false-test 是表达式:

(equal characteristic "fierce")

在 Lisp 中,equal 是一个函数,它确定其第一个参数是否等于第二个参数。第二个参数是字符串 "fierce",第一个参数是符号 characteristic 的值,换句话说,就是传递给该函数的参数。

type-of-animal 的第一个示例中,传递了参数 "fierce"。由于 "fierce" 等于 "fierce",表达式 (equal characteristic "fierce") 返回 true。当发生这种情况时,if 会评估 if 的第二个参数或 true 部分:(message "它是一只老虎!")

另一方面,在 type-of-animal 的第二个示例中,传递了参数 "striped""striped" 不等于 "fierce",因此 true 部分不会被评估,if 表达式返回 nil