Next: Truth & Falsehood, Previous: if, Up: Writing Defuns [Contents][Index]
if
式はtrue-or-false-testがfalseをリターンした際のために、else-partと呼ばれる3つ目の引数をオプションでもつことができます。この場合にはif
式全体のうちの2つ目の引数(then-part)は評価されませんが、3つ目の引数(else-part)は評価されます。これは“もしも(if)暖かくて晴れていたら、それなら(then)ビーチへ行き、そうでなければ(else)本を読もう!”という判断における曇っていた場合の判断のようなものだと思うかもしれません。
“else”という単語をLispのコード内に記述することはありません。if
式のthen-partの後に続くのがelse-partです。Lispで記述する場合には、else-partは通常だと自身の行の先頭から始まり、then-partよりもインデントが少なくなります:
(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-partとelse-partの区別が容易になります(GNU
Emacsにはif
式を自動的に正しくインデントするコマンドが複数ある; GNU Emacs
Helps You Type Listsを参照)。
単にif
式の追加パーツとして組み合わせることによって、type-of-animal
関数がelse-partを含むように拡張できます。
以下のバージョンの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"
(fierceより残忍·獰猛)でも、メッセージには当然"It is not
fierce!"
が表示プリントされるでしょうが、これは誤解を招きかねません。あなたがコードを記述する際には、このような何らかの引数がif
によってテストされる可能性を考慮して、それに応じてプログラムを記述する必要があります。)