If-then-else Expressions
========================
An `if' expression may have an optional third argument, called the
"else-part", for the case when the true-or-false-test returns false.
When this happens, the second argument or then-part of the overall `if'
expression is _not_ evaluated, but the third or else-part _is_
evaluated. You might think of this as the cloudy day alternative for
the decision `if it is warm and sunny, then go to the beach, else read
a book!".
The word "else" is not written in the Lisp code; the else-part of an
`if' expression comes after the then-part. In the written Lisp, the
else-part is usually written to start on a line of its own and is
indented less than the then-part:
(if TRUE-OR-FALSE-TEST
ACTION-TO-CARRY-OUT-IF-THE-TEST-RETURNS-TRUE
ACTION-TO-CARRY-OUT-IF-THE-TEST-RETURNS-FALSE)
For example, the following `if' expression prints the message `4 is
not greater than 5!' when you evaluate it in the usual way:
(if (> 4 5) ; if-part
(message "5 is greater than 4!") ; then-part
(message "4 is not greater than 5!")) ; else-part
Note that the different levels of indentation make it easy to
distinguish the then-part from the else-part. (GNU Emacs has several
commands that automatically indent `if' expressions correctly. Note:GNU Emacs Helps You Type Lists.)
We can extend the `type-of-animal' function to include an else-part
by simply incorporating an additional part to the `if' expression.
You can see the consequences of doing this if you evaluate the
following version of the `type-of-animal' function definition to
install it and then evaluate the two subsequent expressions to pass
different arguments to the function.
(defun type-of-animal (characteristic) ; Second version.
"Print message in echo area depending on CHARACTERISTIC.
If the CHARACTERISTIC is the symbol `fierce',
then warn of a tiger;
else say it's not fierce."
(if (equal characteristic 'fierce)
(message "It's a tiger!")
(message "It's not fierce!")))
(type-of-animal 'fierce)
(type-of-animal 'zebra)
When you evaluate `(type-of-animal 'fierce)', you will see the
following message printed in the echo area: `"It's a tiger!"'; but when
you evaluate `(type-of-animal 'zebra)', you will see `"It's not
fierce!"'.
(Of course, if the CHARACTERISTIC were `ferocious', the message
`"It's not fierce!"' would be printed; and it would be misleading!
When you write code, you need to take into account the possibility that
some such argument will be tested by the `if' and write your program
accordingly.)