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が出力されます。