Common Lisp the Language, 2nd Edition
Generators are generalized input streams in the sense of
Smalltalk [20]. A generator can produce a potentially
unbounded number of elements of any type. Individual elements are not
computed until requested by next-in. When an element is taken from
a generator, it is removed by side effect. Subsequent uses of
next-in obtain later elements.
There is a close relationship between a generator and a series of the elements it produces. In particular, any series can be converted into a generator. As a result, all the scanner functions used for creating series (see appendix A) can be used to create generators as well. There is no need to have a separate set of functions for creating generators.
Gatherers are generalized output streams. Elements of any type can be entered into a gatherer using next-out. The gatherer combines the elements together in time-sequence order into a net result. This result can be retrieved using result-of.
There is a close relationship between a gatherer and a collector function
that combines elements in the same way. In particular, any one-input
one-output collector can be converted into a gatherer. As a result, all
the collectors used for computing summary results from series can be used to
create gatherers. There is no need to have a separate set of functions for
creating gatherers.