Common Lisp the Language, 2nd Edition

Next: Parsing Loop Clauses Up: Loop Previous: Introduction

# 26.2. How the Loop Facility Works

The driving element of the Loop Facility is the `loop` macro. When Lisp encounters a `loop` macro call form, it invokes the Loop Facility and passes to it the loop clauses as a list of unevaluated forms, as with any macro. The loop clauses contain Common Lisp forms and loop keywords. The loop keywords are recognized by their symbol name, regardless of the packages that contain them. The `loop` macro translates the given form into Common Lisp code and returns the expanded form.

The expanded loop form is one or more lambda-expressions for the local binding of loop variables and a block and a tagbody that express a looping control structure. The variables established in the loop construct are bound as if by using `let` or `lambda`. Implementations can interleave the setting of initial values with the bindings. However, the assignment of the initial values is always calculated in the order specified by the user. A variable is thus sometimes bound to a harmless value of the correct data type, and then later in the prologue it is set to the true initial value by using `setq`.

The expanded form consists of three basic parts in the tagbody:

- The loop prologue contains forms that are executed before iteration begins, such as initial settings of loop variables and possibly an initial termination test.

- The loop body contains those forms that are executed during iteration, including application-specific calculations, termination tests, and variable stepping. Stepping is the process of assigning a variable the next item in a series of items.

- The loop epilogue contains forms that are executed after iteration terminates, such as code to return values from the loop.

Expansion of the `loop` macro produces an implicit block (named `nil`). Thus, the Common Lisp macro `return` and the special form `return-from` can be used to return values from a loop or to exit a loop.

Within the executable parts of loop clauses and around the entire loop form, you can still bind variables by using the Common Lisp special form `let`.

Next: Parsing Loop Clauses Up: Loop Previous: Introduction