exercise 3.33
(define (averager a b c) (let ((d (make-connector)) (e (make-connector))) (adder a b d) (multiplier c e d) (constant 2.0 e) 'ok))
こんな感じ。
gosh> (define x (make-connector)) x gosh> (define y (make-connector)) y gosh> (define z (make-connector)) z gosh> (probe 'x x) #<closure (probe me)> gosh> (probe 'y y) #<closure (probe me)> gosh> (probe 'z z) #<closure (probe me)> gosh> (averager x y z) ok gosh> (set-value! x 30 'k0ncha) Probe: x = 30 done gosh> (set-value! y 70 'k0ncha) Probe:z = 50.0 Probe:y = 70 done
zのprobeが先に呼ばれているけど、これは関数の登録の順番を変えれば変更できるでしょう。
connectorのconstraintsはスタック形式(って言っていいのかな)で保存されてるので、averagerよりyのprobeを先に入れると、
y変更→averagerが呼ばれる→z変更→zのprobe呼ばれる→yのprobeが呼ばれる
見たいな感じだと思われ。