参数为 1 或 2

首先,如果参数值为 1 会发生什么?

函数在文档字符串后有一个 if 表达式。 它判断 number 是否等于 1; 如果是,Emacs 执行 if 的 then 部分, 返回数字 1 作为函数值。 (一行的三角形有 1 颗石子。)

再假设参数值为 2。 这时 Emacs 执行 if 的 else 部分。

else 部分包含一次加法、 对 triangle-recursively 的递归调用 以及一次递减操作,如下:

(+ number (triangle-recursively (1- number)))

Emacs 执行该表达式时, 会先执行最内层表达式,再依次执行其他部分。 详细步骤如下:

Step 1   执行最内层表达式

最内层表达式是 (1- number), 因此 Emacs 将 number 的值从 2 减为 1。

Step 2   执行 triangle-recursively 函数

Lisp 解释器创建一个独立的 triangle-recursively 实例。 这个函数包含在自身内部并不影响执行。 Emacs 将步骤 1 的结果作为参数传给该实例。

在本例中,Emacs 以参数 1 执行 triangle-recursively。 这意味着本次执行返回 1。

Step 3  number 的值

变量 number 是以 + 开头的列表的第二个元素, 值为 2。

Step 4   执行 + 表达式

+ 表达式接收两个参数: 第一个来自 number 的求值(步骤 3), 第二个来自 triangle-recursively 的求值(步骤 2)。

加法结果为 2 + 1 = 3,返回数字 3,结果正确。 两行的三角形共有 3 颗石子。