insert-buffer
With an if
Instead of an or
The job to be done is to make sure the value of buffer
is a
buffer itself and not the name of a buffer. If the value is the name,
then the buffer itself must be got.
You can imagine yourself at a conference where an usher is wandering around holding a list with your name on it and looking for you: the usher is bound to your name, not to you; but when the usher finds you and takes your arm, the usher becomes bound to you.
In Lisp, you might describe this situation like this:
(if (not (holding-on-to-guest)) (find-and-take-arm-of-guest))
We want to do the same thing with a buffer—if we do not have the buffer itself, we want to get it.
Using a predicate called bufferp
that tells us whether we have a
buffer (rather than its name), we can write the code like this:
(if (not (bufferp buffer)) ; if-part (setq buffer (get-buffer buffer))) ; then-part
Here, the true-or-false-test of the if
expression is
(not (bufferp buffer))
; and the then-part is the expression
(setq buffer (get-buffer buffer))
.
In the test, the function bufferp
returns true if its argument is
a buffer—but false if its argument is the name of the buffer. (The
last character of the function name bufferp
is the character
‘p’; as we saw earlier, such use of ‘p’ is a convention that
indicates that the function is a predicate, which is a term that means
that the function will determine whether some property is true or false.
See Using the Wrong Type Object as an
Argument.)
The function not
precedes the expression (bufferp buffer)
,
so the true-or-false-test looks like this:
(not (bufferp buffer))
not
is a function that returns true if its argument is false
and false if its argument is true. So if (bufferp buffer)
returns true, the not
expression returns false and vice versa.
Using this test, the if
expression works as follows: when the
value of the variable buffer
is actually a buffer rather than
its name, the true-or-false-test returns false and the if
expression does not evaluate the then-part. This is fine, since we do
not need to do anything to the variable buffer
if it really is
a buffer.
On the other hand, when the value of buffer
is not a buffer
itself, but the name of a buffer, the true-or-false-test returns true
and the then-part of the expression is evaluated. In this case, the
then-part is (setq buffer (get-buffer buffer))
. This
expression uses the get-buffer
function to return an actual
buffer itself, given its name. The setq
then sets the variable
buffer
to the value of the buffer itself, replacing its previous
value (which was the name of the buffer).