type-of-animal
Function in Detail
Let's look at the type-of-animal
function in detail.
The function definition for type-of-animal
was written by filling
the slots of two templates, one for a function definition as a whole, and
a second for an if
expression.
The template for every function that is not interactive is:
(defun name-of-function (argument-list) "documentation..." body...)
The parts of the function that match this template look like this:
(defun type-of-animal (characteristic)
"Print message in echo area depending on CHARACTERISTIC.
If the CHARACTERISTIC is the symbol `fierce',
then warn of a tiger."
body: the if
expression)
In this case, the name of function is type-of-animal
; it is
passed the value of one argument. The argument list is followed by a
multi-line documentation string. The documentation string is included in
the example because it is a good habit to write documentation string for
every function definition. The body of the function definition consists
of the if
expression.
The template for an if
expression looks like this:
(if true-or-false-test action-to-carry-out-if-the-test-returns-true)
In the type-of-animal
function, the actual code for the if
looks like this:
(if (equal characteristic 'fierce) (message "It's a tiger!")))
Here, the true-or-false-test is the expression:
(equal characteristic 'fierce)
In Lisp, equal
is a function that determines whether its first
argument is equal to its second argument. The second argument is the
quoted symbol 'fierce
and the first argument is the value of the
symbol characteristic
---in other words, the argument passed to
this function.
In the first exercise of type-of-animal
, the argument
fierce
is passed to type-of-animal
. Since fierce
is equal to fierce
, the expression, (equal characteristic
'fierce)
, returns a value of true. When this happens, the if
evaluates the second argument or then-part of the if
:
(message "It's tiger!")
.
On the other hand, in the second exercise of type-of-animal
, the
argument zebra
is passed to type-of-animal
. zebra
is not equal to fierce
, so the then-part is not evaluated and
nil
is returned by the if
expression.
Go to the first, previous, next, last section, table of contents.