GNU Info

Info Node: (emacs-lisp-intro.info)Insert or

(emacs-lisp-intro.info)Insert or


Next: Insert let Prev: if & or Up: insert-buffer
Enter node , (file) or (file)node

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))


automatically generated by info2www version 1.2.2.9