Next: streams unfold, Previous: streams of, Up: streams [Index]
Create a newly–allocated stream containing base in its first
element and apply proc to each element in turn to determine the
succeeding element. See also stream-unfold
and
stream-unfolds
.
Examples:
(stream-iterate (lambda (x) (+ x 1)) 0) => 0 1 2 3 4 ... (stream-iterate (lambda (x) (* x 2)) 1) => 1 2 4 8 16 ...
Given a seed between 0 and 232, exclusive, the following expression creates a stream of pseudo–random integers between 0 and 232, exclusive, beginning with seed, using the method described by Stephen Park and Keith Miller:
(stream-iterate (lambda (x) (modulo (* x 16807) 2147483647)) seed)
Example: successive of the following stream approach the value of the “golden ratio” 1.618...:
(stream-iterate (lambda (x) (+ 1 (/ x))) 1)
Apply a binary procedure to base and the first element of
stream to compute a new base, then apply the procedure to the new
base and the next element of stream to compute a succeeding base,
and so on, accumulating a value that is finally returned as the value of
stream-fold
when the end of the stream is reached.
stream must be finite, or stream-fold
will enter an
infinite loop. See also stream-scan
, which is similar to
stream-fold
, but useful for infinite streams.
For readers familiar with other functional languages, this is a left–fold; there is no corresponding right–fold, since right–fold relies on finite streams that are fully–evaluated, at which time they may as well be converted to a list.
stream-fold
is often used to summarize a stream in a single
value, for instance, to compute the maximum element of a stream.
(define (stream-maximum item< strm) (stream-fold (lambda (x y) (if (item< x y) y x)) (stream-car strm) (stream-cdr strm)))
Sometimes, it is useful to have stream-fold
defined only on
non–null streams:
(define (stream-fold-one proc strm) (stream-fold proc (stream-car strm) (stream-cdr strm)))
stream-minimum
can then be defined as:
(define (stream-minimum item< strm) (stream-fold-one (lambda (x y) (if (item< x y) x y)) strm))
stream-fold
can also be used to build a stream:
(define-stream (isort item< strm) (define-stream (insert strm x) (stream-match strm (() (stream x)) ((y . ys) (if (item< y x) (stream-cons y (insert ys x)) (stream-cons x strm))))) (stream-fold insert stream-null strm))
Accumulate the partial folds of an input stream into a newly–allocated output stream. The output stream is the base followed by:
(stream-fold proc base (stream-take i stream))
for each of the first i elements of stream.
Examples:
(stream-scan + 0 (stream-from 1)) ⇒ (stream 0 1 3 6 10 15 ...) (stream-scan * 1 (stream-from 1)) ⇒ (stream 1 1 2 6 24 120 ...)
Next: streams unfold, Previous: streams of, Up: streams [Index]