The `or' in the Body
--------------------
The purpose of the `or' expression in the `insert-buffer' function
is to ensure that the argument `buffer' is bound to a buffer and not
just to the name of a buffer. The previous section shows how the job
could have been done using an `if' expression. However, the
`insert-buffer' function actually uses `or'. To understand this, it is
necessary to understand how `or' works.
An `or' function can have any number of arguments. It evaluates
each argument in turn and returns the value of the first of its
arguments that is not `nil'. Also, and this is a crucial feature of
`or', it does not evaluate any subsequent arguments after returning the
first non-`nil' value.
The `or' expression looks like this:
(or (bufferp buffer)
(setq buffer (get-buffer buffer)))
The first argument to `or' is the expression `(bufferp buffer)'. This
expression returns true (a non-`nil' value) if the buffer is actually a
buffer, and not just the name of a buffer. In the `or' expression, if
this is the case, the `or' expression returns this true value and does
not evaluate the next expression--and this is fine with us, since we do
not want to do anything to the value of `buffer' if it really is a
buffer.
On the other hand, if the value of `(bufferp buffer)' is `nil',
which it will be if the value of `buffer' is the name of a buffer, the
Lisp interpreter evaluates the next element of the `or' expression.
This is the expression `(setq buffer (get-buffer buffer))'. This
expression returns a non-`nil' value, which is the value to which it
sets the variable `buffer'--and this value is a buffer itself, not the
name of a buffer.
The result of all this is that the symbol `buffer' is always bound
to a buffer itself rather than to the name of a buffer. All this is
necessary because the `set-buffer' function in a following line only
works with a buffer itself, not with the name to a buffer.
Incidentally, using `or', the situation with the usher would be
written like this:
(or (holding-on-to-guest) (find-and-take-arm-of-guest))