理系学生日記

おまえはいつまで学生気分なのか

問題3-37 (3.3.5 Propagation of Constraints)

摂氏と華氏を相互変換する 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

というわけで,うまくいってるぽい.