まず、引数の値が1の場合はどうなるでしょうか?
この関数は、ドキュメント文字列の後に if 式を持っています。これは number の値が 1 と等しいかどうかを判定し、そうであれば Emacs は if 式の then 部を評価し、関数の値として数値 1
を返します。(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の結果を、このtriangle-recursively関数のインスタンスが使用する引数として渡します。
この場合、Emacsは引数1を指定してtriangle-recursivelyを評価します。つまり、このtriangle-recursivelyの評価結果は1となります。
number の値を評価する。変数 number は、+
から始まるリストの2番目の要素であり、その値は 2 です。
+ 式を評価する。+ 式は2つの引数を受け取り、1つ目は number の評価(ステップ3)から、2つ目は triangle-recursively の評価(ステップ2)から得られます。
加算の結果は2と1の和となり、数値3が返されます。これは正しい結果です。2行の三角形には、3個の小石が入っています。