Next: , Previous: , Up: Writing Defuns   [Contents][Index]


3.8 If–then–else Expressions

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によってテストされる可能性を考慮して、それに応じてプログラムを記述する必要があります。)

This page has generated for branch:work/add_lispintr, commit:65845cf60c073f2f3182d1d07483530e9bbe1d96 to check Japanese translation.