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
がリターンされます。