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]