Common Lisp the Language, 2nd Edition
These functions create and process generators.
[Function]
generator series
Given a series, generator returns a generator containing the same elements.
[Macro]
next-in generator {action}*
next-in returns the next element in the generator generator. The actions can be any Lisp expressions. They are evaluated if and only if no more elements can be retrieved from generator. If there are no more elements and no actions, it is an error. It is also an error to apply next-in to a generator a second time after the generator has run out of elements. As an example of generators, consider the following.
(let ((x (generator (scan '(1 2 3 4))))) (with-output-to-string (s) (loop (prin1 (next-in x (return)) s) (prin1 (next-in x (return)) s) (princ "," s)))) => "12,34,"