函数定义的各部分

我们从三个变量开始:三角形中的总行数;每行中的小石子数;以及我们想要计算的小石子的总数。这些变量可以分别命名为 number-of-rowsnumber-of-pebbles-in-rowtotal

totalnumber-of-pebbles-in-row 都仅在函数内部使用,并使用 let 进行声明。显然,total 的初始值应为零。然而,number-of-pebbles-in-row 的初始值应等于三角形中的行数,因为加法将从最长的行开始。

这意味着 let 表达式的开头将如下所示:

(let ((total 0)
      (number-of-pebbles-in-row number-of-rows))
  body…)

小石子的总数可以通过重复将每行的小石子数加到已找到的总数中来找到,即通过反复评估以下表达式:

(setq total (+ total number-of-pebbles-in-row))

在将 number-of-pebbles-in-row 添加到 total 后,number-of-pebbles-in-row 应减一,因为下次循环重复时将添加前一行到总数中。

前一行中的小石子数比当前行中的小石子数少一个,因此可以使用内置的 Emacs Lisp 函数 1- 来计算前一行中的小石子数。可以使用以下表达式完成:

(setq number-of-pebbles-in-row
      (1- number-of-pebbles-in-row))

最后,我们知道 while 循环应在一行中没有小石子时停止重复添加。因此,while 循环的测试简单地是:

(while (> number-of-pebbles-in-row 0)