まず、3つの変数を用意します。三角形の行の総数、1行あたりの小石の数、そして計算したい小石の総数です。これらの変数には、それぞれ number-of-rows、number-of-pebbles-in-row、total
という名前を付けることができます。
total と number-of-pebbles-in-row はいずれも関数内でのみ使用され、let とともに宣言されます。 total
の初期値は、当然ながら 0 であるべきです。 ただし、加算は最も長い行から始まるため、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))
totalにnumber-of-pebbles-in-rowが追加された後、number-of-pebbles-in-rowを1減じる必要があります。次回ループが繰り返される際、直前の行が合計に加算されるためです。
前の行にある小石の数は、現在の行の数より1つ少ないため、Emacs Lispの組み込み関数 1-
を使って前の行の小石の数を計算できます。これは、以下の式で行えます。
(setq number-of-pebbles-in-row
(1- number-of-pebbles-in-row))
最後に、whileループは、小石が一列に並んでいない場合に繰り返し加算を行うのを止める必要があります。したがって、whileループの判定は単純に次のようになります:
(while (> number-of-pebbles-in-row 0)