ifInstead of an
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.)
not precedes the expression
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
returns true, the
not expression returns false and vice-verse:
what is “not true” is false and what is “not false” is true.
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
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
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
(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).