;; Streams mit Platzhaltern (define-record-type :stream-nil (make-stream-nil) stream-nil?) (define the-stream-nil (make-stream-nil)) (define-record-type :stream-head (make-stream-head first next-rv) stream-head? (first stream-head-first) (next-rv stream-head-next-rv)) (define-record-type :stream (really-make-stream rv) stream? (rv stream-rv)) (define (stream-take stream n) (let loop ((i n) (stream-head (sync (stream-rv stream))) (reverse-result '())) (if (or (zero? i) (stream-nil? stream-head)) (reverse reverse-result) (loop (- i 1) (sync (stream-head-next-rv stream-head)) (cons (stream-head-first stream-head) reverse-result))))) (define (make-stream) (let ((placeholder (make-placeholder))) (values placeholder (really-make-stream (placeholder-value-rv placeholder))))) (define (extend-stream! placeholder value) (let ((new-placeholder (make-placeholder))) (placeholder-set! placeholder (make-stream-head value (placeholder-value-rv new-placeholder))) new-placeholder)) (define (terminate-stream! placeholder) (placeholder-set! placeholder the-stream-nil)) (define (stream-from-to i j) (call-with-values make-stream (lambda (placeholder stream) (spawn (lambda () (let loop ((placeholder placeholder) (i i)) (if (< i j) (loop (extend-stream! placeholder i) (+ 1 i)) (terminate-stream! placeholder))))) stream)))