SRFI-41 Stream Primitives
This library provides eight operators: constructors for stream-null and stream-pairs, type predicates for streams and the two kinds of streams, accessors for both fields of a stream-pair, and a lambda that creates procedures that return streams.
Scheme Variable: stream-null
A promise that, when forced, is a single object, distinguishable from all other objects, that represents the null stream. stream-null is immutable and unique.
Scheme Syntax: stream-cons object-expr stream-expr
Creates a newly-allocated stream containing a promise that, when forced, is a stream-pair with object-expr in its stream-car and stream-expr in its stream-cdr. Neither object-expr nor stream-expr is evaluated when stream-cons is called.
Once created, a stream-pair is immutable; there is no stream-set-car! or stream-set-cdr! that modifies an existing stream-pair. There is no dotted-pair or improper stream as with lists.
Scheme Procedure: stream? object
Returns true if object is a stream, otherwise returns false. If object is a stream, its promise will not be forced. If (stream? obj) returns true, then one of (stream-null? obj) or (stream-pair? obj) will return true and the other will return false.
Scheme Procedure: stream-null? object
Returns true if object is the distinguished null stream, otherwise returns false. If object is a stream, its promise will be forced.
Scheme Procedure: stream-pair? object
Returns true if object is a stream-pair constructed by stream-cons, otherwise returns false. If object is a stream, its promise will be forced.
Scheme Procedure: stream-car stream
Returns the object stored in the stream-car of stream. An error is signaled if the argument is not a stream-pair. This causes the object-expr passed to stream-cons to be evaluated if it had not yet been; the value is cached in case it is needed again.
Scheme Procedure: stream-cdr stream
Returns the stream stored in the stream-cdr of stream. An error is signaled if the argument is not a stream-pair.
Scheme Syntax: stream-lambda formals body …
Creates a procedure that returns a promise to evaluate the body of the procedure. The last body expression to be evaluated must yield a stream. As with normal lambda, formals may be a single variable name, in which case all the formal arguments are collected into a single list, or a list of variable names, which may be null if there are no arguments, proper if there are an exact number of arguments, or dotted if a fixed number of arguments is to be followed by zero or more arguments collected into a list. Body must contain at least one expression, and may contain internal definitions preceding any expressions to be evaluated.
(define strm123
(stream-cons 1
(stream-cons 2
(stream-cons 3
stream-null))))
(stream-car strm123) ⇒ 1
(stream-car (stream-cdr strm123) ⇒ 2
(stream-pair?
(stream-cdr
(stream-cons (/ 1 0) stream-null))) ⇒ #f
(stream? (list 1 2 3)) ⇒ #f
(define iter
(stream-lambda (f x)
(stream-cons x (iter f (f x)))))
(define nats (iter (lambda (x) (+ x 1)) 0))
(stream-car (stream-cdr nats)) ⇒ 1
(define stream-add
(stream-lambda (s1 s2)
(stream-cons
(+ (stream-car s1) (stream-car s2))
(stream-add (stream-cdr s1)
(stream-cdr s2)))))
(define evens (stream-add nats nats))
(stream-car evens) ⇒ 0
(stream-car (stream-cdr evens)) ⇒ 2
(stream-car (stream-cdr (stream-cdr evens))) ⇒ 4