Next: fwd-sentence re-search, Previous: Complete forward-sentence, Up: forward-sentence [Contents][Index]
while
loopsTwo while
loops follow. The first while
has a
true-or-false-test that tests true if the prefix argument for
forward-sentence
is a negative number. This is for going backwards.
The body of this loop is similar to the body of the second while
clause, but it is not exactly the same. We will skip this while
loop
and concentrate on the second while
loop.
The second while
loop is for moving point forward. Its skeleton
looks like this:
(while (> arg 0) ; true-or-false-test
(let varlist
(if (true-or-false-test)
then-part
else-part
(setq arg (1- arg)))) ; while
loop decrementer
The while
loop is of the decrementing kind. (See A Loop with a Decrementing Counter.) It has a true-or-false-test
that tests true so long as the counter (in this case, the variable
arg
) is greater than zero; and it has a decrementer that subtracts 1
from the value of the counter every time the loop repeats.
If no prefix argument is given to forward-sentence
, which is the most
common way the command is used, this while
loop will run once, since
the value of arg
will be 1.
The body of the while
loop consists of a let
expression, which
creates and binds a local variable, and has, as its body, an if
expression.
The body of the while
loop looks like this:
(let ((par-end (save-excursion (end-of-paragraph-text) (point)))) (if (re-search-forward sentence-end par-end t) (skip-chars-backward " \t\n") (goto-char par-end)))
The let
expression creates and binds the local variable
par-end
. As we shall see, this local variable is designed to provide
a bound or limit to the regular expression search. If the search fails to
find a proper sentence ending in the paragraph, it will stop on reaching the
end of the paragraph.
But first, let us examine how par-end
is bound to the value of the
end of the paragraph. What happens is that the let
sets the value of
par-end
to the value returned when the Lisp interpreter evaluates the
expression
(save-excursion (end-of-paragraph-text) (point))
In this expression, (end-of-paragraph-text)
moves point to the end of
the paragraph, (point)
returns the value of point, and then
save-excursion
restores point to its original position. Thus, the
let
binds par-end
to the value returned by the
save-excursion
expression, which is the position of the end of the
paragraph. (The end-of-paragraph-text
function uses
forward-paragraph
, which we will discuss shortly.)
Emacs next evaluates the body of the let
, which is an if
expression that looks like this:
(if (re-search-forward sentence-end par-end t) ; if-part (skip-chars-backward " \t\n") ; then-part (goto-char par-end))) ; else-part
The if
tests whether its first argument is true and if so, evaluates
its then-part; otherwise, the Emacs Lisp interpreter evaluates the
else-part. The true-or-false-test of the if
expression is the
regular expression search.
It may seem odd to have what looks like the real work of the
forward-sentence
function buried here, but this is a common way this
kind of operation is carried out in Lisp.
Next: fwd-sentence re-search, Previous: Complete forward-sentence, Up: forward-sentence [Contents][Index]