Common Lisp the Language, 2nd Edition
![]()
Next: Establishing New
Variable Up: Control
Structure Previous: Function
Invocation
Each of the constructs in this section simply evaluates all the argument forms in order. They differ only in what results are returned.
[Special Form]
progn
{form}*
The progn construct takes a number of forms and
evaluates them sequentially, in order, from left to right. The values of
all the forms but the last are discarded; whatever the last form returns
is returned by the progn form. One says that all the forms
but the last are evaluated for effect, because their execution
is useful only for the side effects caused, but the last form is
executed for value.
progn is the primitive control structure construct for
``compound statements,’’ such as
begin-end blocks in Algol-like
languages. Many Lisp constructs are ``implicit progn’’
forms: as part of their syntax each allows many forms to be written that
are to be evaluated sequentially, discarding the results of all forms
but the last and returning the results of the last form.
If the last form of the progn returns multiple values,
then those multiple values are returned by the progn form.
If there are no forms for the progn, then the result is
nil. These rules generally hold for implicit
progn forms as well.
[Macro]
prog1 first
{form}*
prog1 is similar to progn, but it returns
the value of its first form. All the argument forms are
executed sequentially; the value of the first form is saved while all
the others are executed and is then returned.
prog1 is most commonly used to evaluate an expression
with side effects and to return a value that must be computed
before the side effects happen. For example:
(prog1 (car x) (rplaca x 'foo))
alters the car of x to be foo and
returns the old car of x.
prog1 always returns a single value, even if the first
form tries to return multiple values. As a consequence,
(prog1x) and
(prognx) may behave
differently if x can produce multiple values. See
multiple-value-prog1. A point of style: although
prog1 can be used to force exactly a single value to be
returned, it is conventional to use the function values for
this purpose.
[Macro]
prog2 first
second
{form}*
prog2 is similar to prog1, but it returns
the value of its second form. All the argument forms are
executed sequentially; the value of the second form is saved while all
the other forms are executed and is then returned. prog2 is
provided mostly for historical compatibility.
(prog2 a b c ... z) == (progn a (prog1 b c ... z))
Occasionally it is desirable to perform one side effect, then a
value-producing operation, then another side effect. In such a peculiar
case, prog2 is fairly perspicuous. For example:
(prog2 (open-a-file) (process-the-file) (close-the-file))
;value is that of process-the-file
prog2, like prog1, always returns a single
value, even if the second form tries to return multiple values. As a
consequence of this,
(prog2xy)
and
(prognxy)
may behave differently if y can produce multiple values.
![]()
Next: Establishing New
Variable Up: Control
Structure Previous: Function
Invocation
AI.Repository@cs.cmu.edu