Here is the code for stream-type, extracted from the latest version of
SRFI-45 (at this writing, that version has been submitted to the editors but
has not yet appeared on srfi.schemers.org).
(define-record-type (stream-type make-stream stream?)
(fields (mutable box stream-promise stream-promise!)))
(define-syntax stream-lazy
(syntax-rules ()
((stream-lazy exp) (make-stream (lambda () exp)))))
(define-syntax stream-delay
(syntax-rules ()
((stream-delay exp) (stream-lazy (make-stream (list exp))))))
(define (stream-force prom)
(let ((p (stream-promise prom)))
(cond ((pair? p) (car p))
((stream? p)
(let ((x (stream-force p)))
(let ((content (stream-promise prom)))
(if (pair? content) (cdr content)
(begin (stream-promise! prom (list x)) x)))))
((procedure? p)
(let ((prom* (p)))
(if (not (pair? (stream-promise prom)))
(if (stream? prom*)
(begin (stream-promise! prom (stream-promise prom*))
(stream-promise! prom* prom))
(stream-promise! prom (list prom*))))
(stream-force prom)))
(else (error 'stream-force "invalid promise")))))