(define (make-stream m state) (delay (let ((o (m state))) (if (eq? #f o) '() (cons (car o) (make-stream m (cdr o))))))) (define (stream-cons elem stream) (delay (cons elem stream))) (define (stream-car stream) (car (force stream))) (define (stream-cdr stream) (cdr (force stream))) (define (stream-empty? stream) (null? (force stream))) (define (stream-append s1 s2) (if (stream-empty? s1) s2 (delay (cons (stream-car s1) (stream-append (stream-cdr s1) s2))))) (define (list->stream l) (make-stream (lambda (l) (if (not (null? l)) l ; it just works out that way #f)) l)) (define (stream->list stream) (if (stream-empty? stream) '() (cons (stream-car stream) (stream->list (stream-cdr stream))))) (define (stream-map f stream) (make-stream (lambda (s) (if (stream-empty? s) #f (cons (f (stream-car s)) (stream-cdr s)))) stream)) (define (make-stream-from-file filename) (let ((port (open-input-file filename))) (make-stream (lambda (p) (let ((n (read-char p))) (if (eof-object? n) (begin (close-input-port p) #f) (cons n p)))) port)))