Node:fwd-para between paragraphs, Next:fwd-para within paragraph, Previous:fwd-para while, Up:forward-paragraph
First, let us look at the inner while
loop. This loop handles
the case when point is between paragraphs; it uses three functions
that are new to us: prog1
, eobp
and looking-at
.
prog1
is similar to the progn
special form,
except that prog1
evaluates its arguments in sequence and then
returns the value of its first argument as the value of the whole
expression. (progn
returns the value of its last argument as the
value of the expression.) The second and subsequent arguments to
prog1
are evaluated only for their side effects.
eobp
is an abbreviation of End Of Buffer P
and is a
function that returns true if point is at the end of the buffer.
looking-at
is a function that returns true if the text following
point matches the regular expression passed looking-at
as its
argument.
The while
loop we are studying looks like this:
(while (prog1 (and (not (eobp)) (looking-at paragraph-separate)) (forward-line 1)))
This is a while
loop with no body! The true-or-false-test of the
loop is the expression:
(prog1 (and (not (eobp)) (looking-at paragraph-separate)) (forward-line 1))
The first argument to the prog1
is the and
expression. It
has within in it a test of whether point is at the end of the buffer and
also a test of whether the pattern following point matches the regular
expression for separating paragraphs.
If the cursor is not at the end of the buffer and if the characters
following the cursor mark the separation between two paragraphs, then
the and
expression is true. After evaluating the and
expression, the Lisp interpreter evaluates the second argument to
prog1
, which is forward-line
. This moves point forward
one line. The value returned by the prog1
however, is the
value of its first argument, so the while
loop continues so
long as point is not at the end of the buffer and is between
paragraphs. When, finally, point is moved to a paragraph, the
and
expression tests false. Note however, that the
forward-line
command is carried out anyhow. This means that
when point is moved from between paragraphs to a paragraph, it is left
at the beginning of the second line of the paragraph.