;; Stream-Netzwerke in CML mit selektiver Kommunikation (define (combine proc in-1 in-2 out) (spawn (lambda () (let loop () (let ((pair (select (list (wrap (receive-rv in-1) (lambda (a) (cons a (receive in-2)))) (wrap (receive-rv in-2) (lambda (b) (cons (receive in-1) b))))))) (send out (proc (car pair) (cdr pair))) (loop)))))) (define (delay init in out) (spawn (lambda () (let loop ((message init)) (send out message) (loop (receive in)))))) (define (copy in out-1 out-2) (spawn (lambda () (let loop () (let ((message (receive in))) (select (list (wrap (send-rv out-1 message) (lambda (ignore) (send out-2 message))) (wrap (send-rv out-2 message) (lambda (ignore) (send out-1 message))))) (loop)))))) (define (make-fib-channel) (let ((out (make-channel)) (c1 (make-channel)) (c2 (make-channel)) (c3 (make-channel)) (c4 (make-channel)) (c5 (make-channel))) (delay 0 c4 c5) (copy c2 c3 c4) (combine + c3 c5 c1) (copy c1 c2 out) (send c1 1) out)) (define (write-channel channel) (let loop () (write (receive channel)) (newline) (loop)))