Next: Insert let, Previous: if & or, Up: insert-buffer [Contents][Index]
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))
Next: Insert let, Previous: if & or, Up: insert-buffer [Contents][Index]