問題3.33

(define (averager a b c)
  (let ((d (make-connector))
        (e (make-connector)))
    (adder a b d)
    (multiplier d e c)
    (constant 0.5 e)
    'ok))

(define a (make-connector))
(define b (make-connector))
(define c (make-connector))
(averager a b c)
(probe "A" a)
(probe "B" b)
(probe "Average" c)

(set-value! a 3 'user)
(set-value! b 5 'user)
;Probe: Average = 4.0

(forget-value! a 'user)
(forget-value! b 'user)

(set-value! a 3 'user)
(set-value! c 4 'user)
;Probe: B = 5.0

;; こんなやり方は初めて知った。
;; 一つ一つの端点がネットワーク化されて他に情報伝達することによって動く。
;; 制約プログラミング/論理型プログラミングというらしい。
;; かなり感動的だ。プログラミング観がちょっと変わった気がする。