2.18.1Iteration and Comprehension Forms

Iteratively evaluates body. The for-clauses
introduce bindings whose scope includes body and that
determine the number of times that body is evaluated.

In the simple case, each for-clause has one of its first two
forms, where [idseq-expr] is a shorthand for [(id...)seq-expr]. In this simple case, the seq-exprs are
evaluated left-to-right, and each must produce a sequence value (see
Sequences).

The for form iterates by drawing an element from each
sequence; if any sequence is empty, then the iteration stops, and
#<void> is the result of the for expression. Otherwise
a location is created for each id to hold the values of each
element; the sequence produced by a seq-expr must return as
many values for each iteration as corresponding ids.

The ids are then bound in the body, which is
evaluated, and whose results are ignored. Iteration continues with the
next element in each sequence and with fresh locations for each
id.

A for form with zero for-clauses is equivalent to a
single for-clause that binds an unreferenced id to
a sequence containing a single element. All of the ids must
be distinct according to bound-identifier=?.

If any for-clause has the form #:whenguard-expr,
then only the preceding clauses (containing no #:when)
determine iteration as above, and the body is effectively
wrapped as

Like for/list, but the result is an immutable hash
table; for/hash creates a table using equal? to
distinguish keys, and for/hasheq produces a table using
eq?. The last expression in the bodys must return
two values: a key and a value to extend the hash table accumulated by
the iteration.

Iterates like
for, but when last expression of body produces
#f, then iteration terminates, and the result of the
for/and expression is #f. If the body
is never evaluated, then the result of the for/and
expression is #t. Otherwise, the result is the (single)
result from the last evaluation of body.

Iterates like
for, but when last expression of body produces
a value other than #f, then iteration terminates, and
the result of the for/or expression is the same
(single) value. If the body is never evaluated, then the
result of the for/or expression is
#f. Otherwise, the result is #f.

Similar to for/list, but the last body expression
should produce as many values as given ids, and the result is
as many lists as supplied ids. The ids are bound to
the lists accumulated so far in the for-clauses and
bodys.

Iterates like
for, but after body is evaluated the first
time, then the iteration terminates, and the for/first
result is the (single) result of body. If the
body is never evaluated, then the result of the
for/first expression is #f.

Iterates like for. Before iteration starts, the
init-exprs are evaluated to produce initial accumulator
values. At the start of each iteration, a location is generated
for each accum-id, and the corresponding current accumulator
value is placed into the location. The last expression in
body must produce as many values as accum-ids, and
those values become the current accumulator values. When iteration
terminates, the results of the fold/for expression are the
accumulator values.

Defines id as syntax. An (id. rest) form is
treated specially when used to generate a sequence in a
clause of for (or one of its variants). In that
case, the procedure result of clause-transform-expr is called
to transform the clause.

When id is used in any other expression position, the result
of expr-transform-expr is used. If it is a procedure of zero
arguments, then the result must be an identifier other-id,
and any use of id is converted to a use of
other-id. Otherwise,expr-transform-expr must
produce a procedure (of one argument) that is used as a macro
transformer.

When the clause-transform-expr transformer is used, it is
given a clause as an argument, where the clause’s form is
normalized so that the left-hand side is a parenthesized sequence of
identifiers. The right-hand side is of the form (id. rest).
The result can be either #f, to indicate that the forms
should not be treated specially (perhaps because the number of bound
identifiers is inconsistent with the (id. rest) form), or a
new clause to to replace the given one. The new clause might
use :do-in.

where body-bindings and done-expr are from the
context of the :do-in use. The identifiers bound by the
for clause are typically part of the ([(inner-id...)inner-expr]...) section.

The actual loop binding and call has additional loop
arguments to support iterations in parallel with the :do-in
form, and the other pieces are similarly accompanied by pieces from
parallel iterations.

2.18.3Do Loops

To initialize the loop, the init-exprs are evaluated in order
and bound to the corresponding ids. The ids are
bound in all expressions within the form other than the
init-exprs.

After the ids are bound, then stop?-expr is
evaluated. If it produces #f, each expr is evaluated
for its side-effect. The ids are then effectively updated
with the values of the step-exprs, where the default
step-expr for id is just id; more
precisely, iteration continues with fresh locations for the
ids that are initialized with the values of the corresponding
step-exprs.

When stop?-expr produces a true value, then the
finish-exprs are evaluated in order, and the last one is
evaluated in tail position to produce the overall value for the
do form. If no finish-expr is provided, the value of
the do form is #<void>.