Common Lisp the Language, 2nd Edition
![]()
Next: Iteration
Up: Control Structure
Previous: Conditionals
The block and return-from constructs
provide a structured lexical non-local exit facility. At any point
lexically within a block construct, a
return-from with the same name may be used to perform an
immediate transfer of control that exits from the block. In
the most common cases this mechanism is more efficient than the dynamic
non-local exit facility provided by catch and
throw, described in section 7.11.
[Special Form]
blockname{form}*
The block construct executes each form from
left to right, returning whatever is returned by the last form.
If, however, a return or return-from form that
specifies the same name is executed during the execution of
some form, then the results specified by the
return or return-from are immediately returned
as the value of the block construct, and execution proceeds
as if the block had terminated normally. In this,
block differs from progn; the
progn construct has nothing to do with
return.
The name is not evaluated; it must be a symbol. The scope of
the name is lexical; only a return or
return-from textually contained in some form can
exit from the block. The extent of the name is dynamic. Therefore it is
only possible to exit from a given run-time incarnation of a block once,
either normally or by explicit return.
The defun form implicitly puts a block
around the body of the function defined; the block has the
same name as the function. Therefore one may use
return-from to return prematurely from a function defined
by defun.
The lexical scoping of the block name is fully general and has
consequences that may be surprising to users and implementors of other
Lisp systems. For example, the return-from in the following
example actually does work in Common Lisp as one might expect:
(block loser
(catch 'stuff
(mapcar #'(lambda (x) (if (numberp x)
(hairyfun x)
(return-from loser nil)))
items)))
Depending on the situation, a return in Common Lisp may
not be simple. A return can break up catchers if necessary
to get to the block in question. It is possible for a ``closure’’
created by function for a lambda-expression to refer to a
block name as long as the name is lexically apparent.
[Special Form]
return-fromname[result]
return-from is used to return from a block
or from such constructs as do and prog that
implicitly establish a block. The name is not
evaluated and must be a symbol. A block construct with the
same name must lexically enclose the occurrence of
return-from; whatever the evaluation of result
produces is immediately returned from the block. (If the result
form is omitted, it defaults to nil. As a matter of style,
this form ought to be used to indicate that the particular value
returned doesn’t matter.)
The return-from form itself never returns and cannot
have a value; it causes results to be returned from a block
construct. If the evaluation of result produces multiple
values, those multiple values are returned by the construct exited.
[Macro]
return
[result]
(returnform) is
identical in meaning to
(return-from ``nil``form);
it returns from a block named nil. Blocks established
implicitly by iteration constructs such as do are named
nil, so that return will exit properly from
such a construct.
![]()
Next: Iteration
Up: Control Structure
Previous: Conditionals
AI.Repository@cs.cmu.edu