Node:Insert or, Next:Insert let, Previous:if & or, Up:insert-buffer
or in the BodyThe 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))