問題3.34 – SICP(計算機プログラムの構造と解釈)その132

問題3.34

multiplierprocess-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 手続きのいずれの条件式にもマッチしない。

SICP 問題3.34

(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
計算機プログラムの構造と解釈
ジェラルド・ジェイ サスマン ジュリー サスマン ハロルド エイブルソン
ピアソンエデュケーション
売り上げランキング: 6542
«
»