首先,如果参数值为1会发生什么?
在文档字符串之后,函数有一个 if
表达式。它测试 number
的值是否等于1;如果是,Emacs 将评估 if
表达式的 then-部分,将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的结果作为这个 triangle-recursively
函数实例使用的参数传递。
在这种情况下,Emacs使用参数1评估 triangle-recursively
。这意味着这次评估返回1。
number
的值。变量 number
是以 +
开头的列表的第二个元素;它的值为2。
+
表达式。+
表达式接收两个参数,第一个来自 number
的评估(步骤3),第二个来自 triangle-recursively
的评估(步骤2)。
加法的结果是2加1的和,返回数字3,这是正确的。一个有两行的三角形中有三颗小石子。