cond ¶ を用いた再帰の例前述の triangle-recursively のバージョンは、if という特殊形式で記述されます。また、cond
と呼ばれる別の特殊形式を用いて記述することも可能です。特殊形式 cond
の名称は、‘conditional’ という語の略称です。
cond という特殊形式は、Emacs Lisp のソースコードでは if ほど頻繁には使われないものの、解説するに値するほどには使われている。
cond 式のテンプレートは次のようになります。
(cond body...)
ここで body はリストの連なりです。
より詳細に書き出すと、テンプレートは以下のようになります。
(cond (first-true-or-false-test first-consequent) (second-true-or-false-test second-consequent) (third-true-or-false-test third-consequent) ...)
Lispインタプリタがcond式を評価する際、condの本体内にある一連の式のうち、最初の式の第1要素(CARまたはtrue-or-false-test)を評価します。
真偽判定テストが式の残りの部分 nil
を返す場合、後続部分はスキップされ、次の式の真偽判定テストが評価されます。真偽判定テストが nil
以外の値を返す式が見つかった場合、その式の後続部分が評価されます。後続部分は1つ以上の式で構成されることがあります。後続部分が複数の式からなる場合、各式は順次評価され、最後の式の値が返されます。式に後続部分がない場合は、真偽判定テストの値が返されます。
真偽判定テストのいずれも真とならない場合、cond 式は nil を返します。
cond を使って記述すると、triangle
関数は次のようになります。
(defun triangle-using-cond (number)
(cond ((<= number 0) 0)
((= number 1) 1)
((> number 1)
(+ number (triangle-using-cond (1- number))))))
この例では、cond は数値が 0 以下の場合は 0 を、1 の場合は 1 を返し、数値が 1
より大きい場合は (+ number (triangle-using-cond (1-
number))) を評価します。