Go to the previous, next section.

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

Go to the previous, next section.