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 に使った。_ とある。
むむむ。