GNU Emacs 32.0.50 (9008bf64c3) のマニュアルを PLaMo 翻訳で機械翻訳したものです。誤訳を含むことがあります。原文: https://www.gnu.org/software/emacs/manual/html_node/eintr/Recursion-with-cond.html ・ emacs-doc.conao3.com

11.3.5 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))) を評価します。