Re: simpler srfi 45 implementation
AndrevanTonder 14 Nov 2007 13:41 UTC
Just to avoid confusion.
This version is not safe for space and
does not implement SRFI-45.
Andre
On Wed, 14 Nov 2007, Phil Bewig wrote:
> 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")))))