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