参数为1或2

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

在文档字符串之后,函数有一个 if 表达式。它测试 number 的值是否等于1;如果是,Emacs 将评估 if 表达式的 then-部分,将1作为函数的值返回。(一个只有一行的三角形中有一个小石子。)

然而,假设参数值为2。在这种情况下,Emacs 将评估 if 表达式的 else-部分。

else-部分由一个加法、对 triangle-recursively 的递归调用和一个递减操作组成;它看起来像这样:

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

当Emacs评估这个表达式时,首先评估最内层的表达式;然后按顺序评估其他部分。以下是详细的步骤:

步骤1    评估最内层的表达式。

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

步骤2    评估 triangle-recursively 函数。

Lisp解释器创建了 triangle-recursively 的一个单独实例。这个函数包含在它自己的内部并不重要。Emacs将步骤1的结果作为这个 triangle-recursively 函数实例使用的参数传递。

在这种情况下,Emacs使用参数1评估 triangle-recursively。这意味着这次评估返回1。

步骤3    评估 number 的值。

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

步骤4    评估 + 表达式。

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

加法的结果是2加1的和,返回数字3,这是正确的。一个有两行的三角形中有三颗小石子。