問題3.34 – SICP(計算機プログラムの構造と解釈)その132
2009年03月20日
問題3.34
multiplier
の process-new-value
手続きに、いずれの条件式にも一致しなかった場合にメッセージを印字するように修正する。
(define (multiplier m1 m2 product) (define (process-new-value) (cond ((or (and (has-value? m1) (= (get-value m1) 0)) (and (has-value? m2) (= (get-value m2) 0))) (set-value! product 0 me)) ((and (has-value? m1) (has-value? m2)) (set-value! product (* (get-value m1) (get-value m2)) me)) ((and (has-value? product) (has-value? m1)) (set-value! m2 (/ (get-value product) (get-value m1)) me)) ((and (has-value? product) (has-value? m2)) (set-value! m1 (/ (get-value product) (get-value m2)) me)) (else (display "[no cond is matched.]")))) ;; この行を追加 (define (process-forget-value) (forget-value! product me) (forget-value! m1 me) (forget-value! m2 me) (process-new-value)) (define (me request) (cond ((eq? request 'I-have-a-value) (process-new-value)) ((eq? request 'I-lost-my-value) (process-forget-value)) (else (error "Unknown request -- MULTIPLIER" request)))) (connect m1 me) (connect m2 me) (connect product me) me)
実行結果
A
のみに値をセットした場合は、3つのコネクタのうち2つに値が設定されるために process-new-value
手続きの条件式を満たす。
B
のみに値をセットした場合は、3つのコネクタのうち1つにしか値が設定されないために process-new-value
手続きのいずれの条件式にもマッチしない。
(define (squarer a b) (multiplier a a b)) (define A (make-connector)) (define B (make-connector)) (squarer A B) (probe "A" A) (probe "B" B) (set-value! A 3 'user) gosh> Probe: A = 3 Probe: B = 9done (forget-value! A 'user) gosh> Probe: A = ? Probe: B = ?[no cond is matched.]done (set-value! B 16 'user) gosh> Probe: B = 16[no cond is matched.]done
計算機プログラムの構造と解釈
posted with amazlet at 08.11.07
ジェラルド・ジェイ サスマン ジュリー サスマン ハロルド エイブルソン
ピアソンエデュケーション
売り上げランキング: 6542
ピアソンエデュケーション
売り上げランキング: 6542