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

if の詳細

Lispで記述されるif式では、「then」という語は使われません。判定と処理は、第1要素がifであるリストの第2要素および第3要素となります。とはいえ、if式の判定部分はif-part、第2引数はthen-partと呼ばれることがよくあります。

また、if 式を記述する場合、真偽判定は通常、記号 if と同じ行に記述されますが、判定が真だった場合に実行する処理である then 部は、2行目以降に記述されます。これにより、if 式がより読みやすくなります。

(if true-or-false-test
    action-to-carry-out-if-test-is-true)

真偽判定テストは、Lispインタプリタによって評価される式となります。

以下に、通常通りに評価できる例を示します。テスト内容は、数値 5 が数値 4 より大きいかどうかです。大きいため、メッセージ ‘5 is greater than 4!’ が出力されます。

(if (> 5 4)                             ; if-part
    (message "5 is greater than 4!"))   ; then-part

(関数 > は、第1引数が第2引数より大きいかどうかを判定し、そうであれば true を返します。)

もちろん、実際の使用においては、if 式におけるテストは、(> 5 4) 式のように常に固定されるわけではありません。その代わりに、テストで使用される変数のうち少なくとも1つは、あらかじめは不明な値に束縛されることになります。(もしその値があらかじめ分かっていれば、テストを実行する必要はありません!)

例えば、その値は関数定義の引数に束縛されることがあります。以下の関数定義では、動物の文字が関数に渡される値となります。characteristic に束縛されている値が "fierce" であれば、メッセージ ‘It is a tiger!’ が出力され、そうでなければ nil が返されます。

(defun type-of-animal (characteristic)
  "Print message in echo area depending on CHARACTERISTIC.
If the CHARACTERISTIC is the string \"fierce\",
then warn of a tiger."
  (if (equal characteristic "fierce")
      (message "It is a tiger!")))

GNU Emacs上でこれを読んでいる場合は、通常の方法で関数定義を評価してEmacsにインストールし、その後、以下の2つの式を評価して結果を確認できます。

(type-of-animal "fierce")

(type-of-animal "striped")

(type-of-animal "fierce")を評価すると、エコー領域に次のメッセージが出力されます:"It is a tiger!"。また、(type-of-animal "striped")を評価すると、エコー領域にnilが出力されます。