The initially
and finally
constructs
evaluate forms that occur before and after the loop body.
The initially
construct causes the supplied
compound-forms
to be evaluated
in the loop prologue, which precedes all loop code except for
initial settings supplied by constructs with
, for
, or
as
.
The code for any initially
clauses is
executed
in the order in which the clauses appeared in
the loop.
The finally
construct causes the supplied
compound-forms
to be evaluated
in the loop epilogue after normal iteration terminates.
The code for any finally
clauses is
executed
in the order in which the clauses appeared in
the loop. The collected code is executed once in the loop epilogue
before any implicit values are returned from the accumulation clauses.
An explicit transfer of control (e.g., by return, go, or throw)
from the loop body, however, will exit the
loop without executing the epilogue code.
Clauses such as return
, always
, never
, and
thereis
can bypass the finally
clause.
return (or return-from, if the named
option was supplied) can be used after finally
to return values from a loop.
Such an explicit return inside the
finally
clause takes precedence over returning the accumulation
from clauses supplied by such keywords as collect
, nconc
,
append
, sum
, count
, maximize
, and
minimize
;
the accumulation values for these preempted clauses are not returned by
loop if return or return-from is used.