4.7.5 Accumulation Clauses

These clauses cause the loop to accumulate information about the specified Lisp form. The accumulated result is returned from the loop unless overridden, say, by a return clause.

collect form

This clause collects the values of form into a list. Several examples of collect appear elsewhere in this manual.

The word collecting is a synonym for collect, and likewise for the other accumulation clauses.

append form

This clause collects lists of values into a result list using append.

nconc form

This clause collects lists of values into a result list by destructively modifying the lists rather than copying them.

concat form

This clause concatenates the values of the specified form into a string. (It and the following clause are extensions to standard Common Lisp.)

vconcat form

This clause concatenates the values of the specified form into a vector.

count form

This clause counts the number of times the specified form evaluates to a non-nil value.

sum form

This clause accumulates the sum of the values of the specified form, which must evaluate to a number.

maximize form

This clause accumulates the maximum value of the specified form, which must evaluate to a number. The return value is undefined if maximize is executed zero times.

minimize form

This clause accumulates the minimum value of the specified form.

Accumulation clauses can be followed by ‘into var’ to cause the data to be collected into variable var (which is automatically let-bound during the loop) rather than an unnamed temporary variable. Also, into accumulations do not automatically imply a return value. The loop must use some explicit mechanism, such as finally return, to return the accumulated result.

It is valid for several accumulation clauses of the same type to accumulate into the same place. From Steele:

(cl-loop for name in '(fred sue alice joe june)
         for kids in '((bob ken) () () (kris sunshine) ())
         collect name
         append kids)
        ⇒ (fred bob ken sue alice joe kris sunshine june)