(define (add ch-1 ch-2 res) (spawn (lambda () (let lp () (select (wrap (receive-rv ch-1) (lambda (v) (send res (+ v (receive ch-2))))) (wrap (receive-rv ch-2) (lambda (v) (send res (+ v (receive ch-1)))))) (lp))))) (define (copy in-ch out-ch1 out-ch2) (spawn (lambda () (let lp () (let ((v (receive in-ch))) (select (wrap (send-rv out-ch1 v) (lambda (ignore) (send out-ch2 v))) (wrap (send-rv out-ch2 v) (lambda (ignore) (send out-ch1 v))))) (lp))))) (define (delay init in-ch out-ch) (spawn (lambda () (let lp ((v init)) (select (wrap (send-rv out-ch v) (lambda (ignore) (lp (receive in-ch)))) (wrap (receive-rv in-ch) (lambda (next) (send out-ch v) (lp next)))))))) (define (make-fib-network) (let ((out-ch (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) (add c3 c5 c1) (copy c1 c2 out-ch) (send c1 1) out-ch))