if 式には、true-or-false 判定が false を返した場合のための、else-part と呼ばれる任意の第3引数を指定できます。このとき、全体の if 式の第2引数(then-part)は 評価されませんが、第3引数(else-part)は 評価されます。これは、「暖かくて晴れているならビーチへ、そうでなければ本を読もう!」という判断に対する、「曇りの日」の代替案のようなものだと考えればよいでしょう。
Lispコードには「else」という単語は記述されません。if式のelse部分はthen部分の後に続きます。記述形式のLispでは、else部分は通常、独立した行から書き始められ、then部分よりもインデントを浅くします:
(if true-or-false-test
action-to-carry-out-if-the-test-returns-true
action-to-carry-out-if-the-test-returns-false)
例えば、以下の if 式を通常の方法で評価すると、メッセージ ‘4 is not greater than 5!’ が出力されます。
(if (> 4 5) ; if-part (message "4 falsely greater than 5!") ; then-part (message "4 is not greater than 5!")) ; else-part
インデントのレベルが異なるため、then部分とelse部分を容易に区別できる点に注意してください。(GNU Emacsには、if式を正しく自動インデントするコマンドがいくつか用意されています。GNU Emacs Helps You Type Listsを参照してください。)
if 式に別の部分を追加するだけで、type-of-animal 関数を拡張して else 節を含めることができます。
type-of-animal
関数定義の以下のバージョンを評価してインストールし、続いて2つの式を評価して関数に異なる引数を渡すことで、このような操作を行った際の結果を確認できます。
(defun type-of-animal (characteristic) ; Second version.
"Print message in echo area depending on CHARACTERISTIC.
If the CHARACTERISTIC is the string \"fierce\",
then warn of a tiger; else say it is not fierce."
(if (equal characteristic "fierce")
(message "It is a tiger!")
(message "It is not fierce!")))
(type-of-animal "fierce") (type-of-animal "striped")
(type-of-animal "fierce")
を評価すると、エコー領域に次のようなメッセージが出力されます:"It is a
tiger!"。一方、(type-of-animal
"striped") を評価すると、"It is not
fierce!" が表示されます。
(もちろん、もし characteristic が "ferocious" であれば、メッセージ "It is not fierce!"
が出力されることになり、それは誤解を招くことになります!コードを書く際は、こうした引数のいずれかが if でテストされる可能性を考慮し、それに応じてプログラムを記述する必要があります。)