Next: type-of-animal in detail, Up: if [Contents][Index]
if
in more detailLispにおいて記述されるif
式では“then”という単語を使いません。1つ目の要素がif
であるようなリストの2つ目の要素がテスト、3つ目の要素がアクションになります。そうであるにも関わらず、if
式でテストを行う部分のことをif-part、2つ目の引数をthen-partと呼ぶことが多々あります。
更にif
式を記述する際には、通常はシンボルif
と同じ行にtrue-or-false-testを記述しますが、テストが真(true)のとき実行するthen-partは2行目以降に記述します。これはif
式を読み易くするためです。
(if true-or-false-test action-to-carry-out-if-test-is-true)
true-or-false-testはLispインタープリターによって評価される式になります。
以下の例は通常の方法で評価できます。数値の5は数値の4より大きいかどうかがテストです。このテストは正しいのでメッセージ‘5 is greater than 4!’が表示されるでしょう。
(if (> 5 4) ; if-part (message "5 is greater than 4!")) ; then-part
(>
は1つ目の引数が2つ目の引数より大きいかどうかをテストして、大きければtrueをリターンする関数です。)
もちろん実際の使用においては式(> 5
4)
のように常に答えが定まったテストをif
式に記述することはないでしょう。かわりにテストで用いる変数のうち少なくとも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
がプリントされるはずです。