摂氏と華氏を相互変換する celsius-fahrenheit-converter という関数が,この章の冒頭にありました.
(define (celsius-fahrenheit-converter c f) (let ((u (make-connector)) (v (make-connector)) (w (make-connector)) (x (make-connector)) (y (make-connector))) (multiplier c w u) (multiplier v x u) (adder v y f) (constant 9 w) (constant 5 x) (constant 32 y) 'ok))
これがあまりに cumbersome だということで,もっと数式的に書こうぜ!
(define (c+ x y) (let ((z (make-connector))) (adder x y z) z)) (define (c- x y) (let ((z (make-connector))) (adder y z x) z)) (define (c* x y) (let ((z (make-connector))) (multiplier x y z) z)) (define (c/ x y) (let ((z (make-connector))) (multiplier y z x) z)) (define (cv x) (let ((z (make-connector))) (constant x z) z)) (define (celsius-fahrenheit-converter x) (c+ (c* (c/ (cv 9) (cv 5)) x) (cv 32))) (define C (make-connector)) (define F (celsius-fahrenheit-converter C))
つーわけで,これもテストしてみるよー.
(probe 'C C) #<closure (probe me)> (set-value! F 140 'kiririmode) # Probe: C = 60done
というわけで,うまくいってるぽい.