SICP 読み (119) 3.3.5 制約の拡散

微妙な理解のまま、そして頭痛が酷いんですが exercise に着手。ってよく見りゃ 3.32 をスルーしてますな。

問題 3.33

とりあえず試験を書いてみる。

  ("3.33"
   ("averager (a, b)"
    (let ((a (make-connector))
	  (b (make-connector))
	  (c (make-connector)))
      (averager a b c)
      (set-value! a 100 'user)
      (set-value! b 50 'user)
      (assert-equal 75 (get-value c))
      )
    )

   ("averager (a, c)"
    (let ((a (make-connector))
	  (b (make-connector))
	  (c (make-connector)))
      (averager a b c)
      (set-value! c 75 'user)
      (set-value! a 100 'user)
      (assert-equal 50 (get-value b))
      )
   )

   ("averager (b, c)"
    (let ((a (make-connector))
	  (b (make-connector))
	  (c (make-connector)))
      (averager a b c)
      (set-value! c 75 'user)
      (set-value! b 50 'user)
      (assert-equal 100 (get-value a))
      )
   )
  )

なんか微妙ですが、本体を書いてみる。

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

うーん。通ったなぁ。なんかあまり実装を理解してないぞ。試験書いてみた方が良いな。なんと言えば良いか分かりませんが、横着しすぎ。

3.3.5 の実装の理解のために

てコトで試験を書いてみる事に。とりあえず書いてみたのが以下。

  ("understanding of implementation"
   ("adder (1)"
    (let ((a (make-connector))
	  (b (make-connector))
	  (c (make-connector)))
      (adder a b c)
      (set-value! a 2 'user)
      (set-value! b 3 'user)
      (assert-equal 5 (get-value c))
      )
    )
   )

試験パスは当たり前なんですが、気になるのは上記において

  • let で a、b、c にコネクタを束縛した時のそれぞれの状態
  • a に 2 を set-value! した時のその他のコネクタの状態

です。って、やっぱきちんと読んでないからワケワカです。ので今からもう少しきちんと読んでみたいと思いますが、どの位デキるか微妙かも。

もう少し記録

上記箇条書きについて少しだけ。
まず、connector なオブジェクトが生成された時点ではその値は false となっている模様。又、制約の実装を見るに上記の _a に 2 を set-velue! した時のその他のコネクタの状態_はいずれも false になっているはず。
ってコトで試験で見てみる。(一部のみ

   ("adder (1)"
    (let ((a (make-connector))
	  (b (make-connector))
	  (c (make-connector)))
      (assert-false (get-value a))
      (assert-false (get-value b))
      (assert-false (get-value c))
      (adder a b c)
      (set-value! a 2 'user)
      (assert-false (get-value b))
      (assert-false (get-value c))
      (set-value! b 3 'user)
      (assert-equal 5 (get-value c))
      )
    )

あと、気になっているのが、informant の説明にある _コネクタの値を設定したオブジェクトの informant_ という記述。ちなみに註釈 32 の _setter は制約でないかもしれない。温度の例では、user を setter に使った。_ とある。

むむむ。