type-of-animal 関数の詳細
¶type-of-animal関数について詳しく見ていきましょう。
type-of-animal の関数定義は、関数定義全体用のテンプレートと、if 式用のテンプレートという2つのテンプレートの空欄を埋める形で記述されました。
インタラクティブでないすべての関数のテンプレートは以下の通りです:
(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つの引数の値が渡されます。引数リストの後には、複数行のドキュメント文字列が続きます。すべての関数定義にドキュメント文字列を記述することは良い習慣であるため、このドキュメント文字列を例に含めています。関数定義の本体は、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!"))
ここで、正誤判定式は次の式となります:
(equal characteristic "fierce")
Lisp では、equal は第1引数が第2引数と等しいかどうかを判定する関数です。第2引数は文字列
"fierce" であり、第1引数はシンボル characteristic の値――言い換えれば、この関数に渡された引数です。
type-of-animal の最初の式では、引数 "fierce" が type-of-animal に渡されます。"fierce" は "fierce" と等しいため、式 (equal
characteristic "fierce") は true を返します。このとき if は、if の第2引数または then-part である
(message "It is a tiger!") を評価します。
一方、type-of-animal の2番目の式では、引数 "striped" が type-of-animal に渡されます。"striped" は "fierce" と等しくないため、then 部分は評価されず、if 式によって nil が返されます。