3.7.1 The 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 string \"fierce\",
then warn of a tiger."
  body: the if expression)

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 code for the if looks like this:

(if (equal characteristic "fierce")
    (message "It is 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 string "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 is a tiger!").

On the other hand, in the second exercise of type-of-animal, the argument "striped" is passed to type-of-animal. "striped" is not equal to "fierce", so the then-part is not evaluated and nil is returned by the if expression.