Common Lisp the Language, 2nd Edition
Next: Dynamic Non-Local Exits
Up: Multiple Values
Previous: Constructs for
Handling
It is often the case that the value of a special form or macro call
is defined to be the value of one of its subforms. For example, the
value of a cond
is the value of the last form in the
selected clause.
In most such cases, if the subform produces multiple values, then the original form will also produce all of those values. This passing back of multiple values of course has no effect unless eventually one of the special forms for receiving multiple values is reached.
To be explicit, multiple values can result from a special form under precisely these circumstances:
Evaluation and application
eval
returns multiple values if the form given it to
evaluate produces multiple values.apply
, funcall
, and
multiple-value-call
pass back multiple values from the
function applied or called.Implicit progn
contexts
progn
passes back multiple values
resulting from evaluation of the last subform. Other situations referred
to as ``implicit progn
,’’ where several forms are evaluated
and the results of all but the last form are discarded, also pass back
multiple values from the last form. These situations include the body of
a lambda-expression, in particular those constructed by
defun
, defmacro
, and deftype
.
Also included are bodies of the constructs eval-when
,
progv
, let
, let*
,
when
, unless
, block
,
multiple-value-bind
, and catch
, as well as
clauses in such conditional constructs as case
,
typecase
, ecase
, etypecase
,
ccase
, and ctypecase
.
X3J13 has voted to add many new constructs to the language that contain
implicit progn
contexts. I won’t attempt to list them all
here. Of particular interest, however, is locally
, which
may be regarded as simply a version of progn
that permits
declarations before its body. This provides a useful building block for
constructing macros that permit declarations (but not documentation
strings) before their bodies and pass back any multiple values produced
by the last sub-form of a body. (If a body can contain a documentation
string, most likely lambda
is the correct building block to
use.)
Conditional constructs
if
passes back multiple values from whichever subform
is selected (the then form or the else form).and
and or
pass back multiple values from
the last subform but not from subforms other than the last.cond
passes back multiple values from the last subform
of the implicit progn
of the selected clause. If, however,
the clause selected is a singleton clause, then only a single value (the
non-nil
predicate value) is returned. This is true even if
the singleton clause is the last clause of the cond
. It is
not permitted to treat a final clause (x)
as being
the same as (t x)
for this reason; the latter passes back
multiple values from the form x
.Returning from a block
block
construct passes back multiple values from
its last subform when it exits normally. If return-from
(or
return
) is used to terminate the block
prematurely, then return-from
passes back multiple values
from its subform as the values of the terminated block
.
Other constructs that create implicit blocks, such as do
,
dolist
, dotimes
, prog
, and
prog*
, also pass back multiple values specified by
return-from
(or return
).do
passes back multiple values from the last form of
the exit clause, exactly as if the exit clause were a cond
clause. Similarly, dolist
and dotimes
pass
back multiple values from the resultform if that is executed.
These situations are all examples of implicit uses of
return-from
.Throwing out of a catch
catch
construct returns multiple values if the
result form in a throw
exiting from such a catch produces
multiple values.Miscellaneous situations
multiple-value-prog1
passes back multiple values from
its first subform. However, prog1
always returns a single
value.unwind-protect
returns multiple values if the form it
protects returns multiple values.the
returns multiple values if the form it contains
returns multiple values.Among special forms that never pass back multiple values are
prog1
, prog2
, setq
, and
multiple-value-setq
. The conventional way to force only one
value to be returned from a form x
is to write
(values x)
.
The most important rule about multiple values is: No matter how many values a form produces, if the form is an argument form in a function call, then exactly one value (the first one) is used.
For example, if you write (cons (floor x))
, then
cons
will always receive exactly one argument
(which is of course an error), even though floor
returns
two values. To pass both values from floor
to
cons
, one must write something like
(multiple-value-call #'cons (floor x))
. In an ordinary
function call, each argument form produces exactly one
argument; if such a form returns zero values, nil
is used
for the argument, and if more than one value, all but the first are
discarded. Similarly, conditional constructs such as if
that test the value of a form will use exactly one value, the first one,
from that form and discard the rest; such constructs will use
nil
as the test value if zero values are returned.
Next: Dynamic Non-Local Exits
Up: Multiple Values
Previous: Constructs for
Handling
AI.Repository@cs.cmu.edu