eintr: else
3.8 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 "4 falsely greater than 5!") ; 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.
GNU Emacs Helps You Type Lists Typing 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 string \"fierce\",
then warn of a tiger; else say it is not fierce."
(if (equal characteristic "fierce")
(message "It is a tiger!")
(message "It is not fierce!")))
(type-of-animal "fierce")
(type-of-animal "striped")
When you evaluate ‘(type-of-animal "fierce")’, you will see the
following message printed in the echo area: ‘"It is a tiger!"’; but when
you evaluate ‘(type-of-animal "striped")’, you will see ‘"It is not
fierce!"’.
(Of course, if the CHARACTERISTIC were ‘"ferocious"’, the message
‘"It is 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.)