let*
expression
The next line of the forward-paragraph
function begins a
let*
expression. This is a different kind of expression than
we have seen so far. The symbol is let*
not let
.
The let*
special form is like let
except that Emacs sets
each variable in sequence, one after another, and variables in the
latter part of the varlist can make use of the values to which Emacs
set variables in the earlier part of the varlist.
In the let*
expression in this function, Emacs binds two
variables: fill-prefix-regexp
and paragraph-separate
.
The value to which paragraph-separate
is bound depends on the
value of fill-prefix-regexp
.
Let's look at each in turn. The symbol fill-prefix-regexp
is
set to the value returned by evaluating the following list:
(and fill-prefix (not (equal fill-prefix "")) (not paragraph-ignore-fill-prefix) (regexp-quote fill-prefix))
This is an expression whose first element is the function and
.
The and
function evaluates each of its arguments until one of
the arguments returns a value of nil
, in which case the
and
expression returns nil
; however, if none of the
arguments returns a value of nil
, the value resulting from
evaluating the last argument is returned. (Since such a value is not
nil
, it is considered true in Lisp.) In other words, an
and
expression returns a true value only if all its arguments
are true.
In this case, the variable fill-prefix-regexp
is bound to a
non-nil
value only if the following four expressions produce a
true (i.e., a non-nil
) value when they are evaluated; otherwise,
fill-prefix-regexp
is bound to nil
.
fill-prefix
nil
.
(not (equal fill-prefix "")
(not paragraph-ignore-fill-prefix)
nil
if the variable
paragraph-ignore-fill-prefix
has been turned on by being set to a
true value such as t
.
(regexp-quote fill-prefix)
and
function. If all the
arguments to the and
are true, the value resulting from
evaluating this expression will be returned by the and
expression
and bound to the variable fill-prefix-regexp
,
The result of evaluating this and
expression successfully is that
fill-prefix-regexp
will be bound to the value of
fill-prefix
as modified by the regexp-quote
function.
What regexp-quote
does is read a string and return a regular
expression that will exactly match the string and match nothing else.
This means that fill-prefix-regexp
will be set to a value that
will exactly match the fill prefix if the fill prefix exists.
Otherwise, the variable will be set to nil
.
The second local variable in the let*
expression is
paragraph-separate
. It is bound to the value returned by
evaluating the expression:
(if fill-prefix-regexp (concat paragraph-separate "\\|^" fill-prefix-regexp "[ \t]*$") paragraph-separate)))
This expression shows why let*
rather than let
was used.
The true-or-false-test for the if
depends on whether the variable
fill-prefix-regexp
evaluates to nil
or some other value.
If fill-prefix-regexp
does not have a value, Emacs evaluates
the else-part of the if
expression and binds
paragraph-separate
to its local value.
(paragraph-separate
is a regular expression that matches what
separates paragraphs.)
But if fill-prefix-regexp
does have a value, Emacs evaluates
the then-part of the if
expression and binds
paragraph-separate
to a regular expression that includes the
fill-prefix-regexp
as part of the pattern.
Specifically, paragraph-separate
is set to the original value
of the paragraph separate regular expression concatenated with an
alternative expression that consists of the fill-prefix-regexp
followed by a blank line. The `^' indicates that the
fill-prefix-regexp
must begin a line, and the optional
whitespace to the end of the line is defined by "[ \t]*$"
.)
The `\\|' defines this portion of the regexp as an alternative to
paragraph-separate
.
Now we get into the body of the let*
. The first part of the body
of the let*
deals with the case when the function is given a
negative argument and is therefore moving backwards. We will skip this
section.
Go to the first, previous, next, last section, table of contents.