Copyright (C) 2000-2012 |
GNU Info (emacs-lisp-intro.info)Insert orThe `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 |