eintr: Insert or
5.2.4 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))