Previous: if in more detail, Up: if [Contents][Index]
type-of-animal Function in Detailtype-of-animal関数を詳細に見ていきましょう。
type-of-animalの関数定義は2つの雛形のスロットを埋めることによって記述されました。1つ目は関数定義、2つ目はif式用の雛形です。
interactiveではないすべての関数にたいする雛形は以下のようなものです:
(defun name-of-function (argument-list) "documentation…" body…)
この雛形に関数のパーツを当てはめると以下のようになります:
(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."
body: the if expression)
これはtype-of-animalという名前の関数であり、1つの引数の値が渡されます。引数リストの後には複数行からなるドキュメント文字列が続きます。すべての関数定義にドキュメント文字列を記述するのは良い習慣なので、この例では関数定義ひドキュメント文字列が含まれています。関数定義のbodyはif式で構成されています。
if式にたいする雛形は以下のようになります:
(if true-or-false-test
action-to-carry-out-if-the-test-returns-true)
type-of-animal関数におけるif式のコードは以下のようになるでしょう:
(if (equal characteristic "fierce")
(message "It is a tiger!"))
以下がこの式におけるtrue-or-false-testです:
(equal characteristic "fierce")
Lispにおいてequalとは1つ目の引数と2つ目の引数が等しいかどうかを判定する関数です。2つ目の引数は文字列"fierce"、2つ目の引数はシンボルcharacteristicの値であり、別の言い方をするとこれは関数に渡された引数です。
type-of-animalの最初の演習では引数"fierce"がtype-of-animalに渡されました。"fierce"は"fierce"と等しいので、式(equal
characteristic
"fierce")は値としてtrueをリターンします。trueがリターンされると、ifは2つ目の引数、つまりifのthen-partである(message
"It is a tiger!")を評価します。
一方でtype-of-animalの2つ目の演習では、type-of-animalに引数"striped"が渡されました。"striped"は"fierce"と等しくないのでthen-partは評価されず、if式によってnilがリターンされます。