首先,如果参数值为 1 会发生什么?
函数在文档字符串后有一个 if 表达式。
它判断 number 是否等于 1;
如果是,Emacs 执行 if 的 then 部分,
返回数字 1 作为函数值。
(一行的三角形有 1 颗石子。)
再假设参数值为 2。
这时 Emacs 执行 if 的 else 部分。
else 部分包含一次加法、
对 triangle-recursively 的递归调用
以及一次递减操作,如下:
(+ number (triangle-recursively (1- number)))
Emacs 执行该表达式时, 会先执行最内层表达式,再依次执行其他部分。 详细步骤如下:
最内层表达式是 (1- number),
因此 Emacs 将 number 的值从 2 减为 1。
triangle-recursively 函数Lisp 解释器创建一个独立的 triangle-recursively 实例。
这个函数包含在自身内部并不影响执行。
Emacs 将步骤 1 的结果作为参数传给该实例。
在本例中,Emacs 以参数 1 执行 triangle-recursively。
这意味着本次执行返回 1。
number 的值变量 number 是以 + 开头的列表的第二个元素,
值为 2。
+ 表达式+ 表达式接收两个参数:
第一个来自 number 的求值(步骤 3),
第二个来自 triangle-recursively 的求值(步骤 2)。
加法结果为 2 + 1 = 3,返回数字 3,结果正确。 两行的三角形共有 3 颗石子。