2013年7月24日水曜日

開発環境

計算機プログラムの構造と解釈(Gerald Jay Sussman(原著)、Julie Sussman(原著)、Harold Abelson(原著)、和田 英一(翻訳)、ピアソンエデュケーション、原書: Structure and Interpretation of Computer Programs (MIT Electrical Engineering and Computer Science)(SICP))の3(標準部品化力, オブジェクトおよび状態)、3.3(可変データでのモデル化)、3.3.5(制約の拡散)、制約システムの使い方、制約システムの実装、コネクタの表現の問題 3.34、問題 3.35を解いてみる。

その他参考書籍

問題3.34

例えばbの値を100にセットしたら、aの値は10になることを意図しているけど、問題のような定義だと、bの値をセットしても、multiplierのprocess-new-value手続きのcondで条件を満たすものがなく、aの値はfalseのままになってしまうという、重要な欠点がある。(multiplierは3つのコネクタのうち2つの値が決定したら、もう1つのコネクタの値が定まる。)

確認。

コード(BBEdit)

sample.scm

(define (squarer a b)
  (multiplier a a b))

(define a (make-connector))
(define b (make-connector))

入出力結果(Terminal, REPL(Read, Eval, Print, Loop))

1 ]=> (probe "a" a)

;Value 2: #[compound-procedure 2 me]

1 ]=> (probe "b" b)

;Value 3: #[compound-procedure 3 me]

1 ]=> (squarer a b)

;Value 4: #[compound-procedure 4 me]

1 ]=> (set-value! b 100 'user)

Probe: b = 100
;Value: done

1 ]=> (get-value a)

;Value: #f

問題3.35

コード(BBEdit)

sample.scm

(define (squarer a b)
  (define (process-new-value)
    (if (has-value? b)
        (if (< (get-value b) 0)
            (error "square less than 0 -- SQUARER" (get-value b))
            (set-value! a (sqrt (get-value b)) me))
        (if (has-value? a)
            (set-value! b (square (get-value a)) me))))
  (define (process-forget-value)
    (forget-value! a me)
    (forget-value! b 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 -- SQSUARER" request))))
  (connect a me)
  (connect b me)
  me)

(define a (make-connector))
(define b (make-connector))

入出力結果(Terminal, REPL(Read, Eval, Print, Loop))

1 ]=> (squarer a b)

;Value 2: #[compound-procedure 2 me]

1 ]=> (probe "a" a)

;Value 3: #[compound-procedure 3 me]

1 ]=> (probe "b" b)

;Value 4: #[compound-procedure 4 me]

1 ]=> (set-value! b 100 'user)

Probe: b = 100
Probe: a = 10
;Value: done

1 ]=> (forget-value! b 'user)

Probe: b = ?
Probe: a = ?
;Value: done

1 ]=> (set-value! a 10 'user)

Probe: a = 10
Probe: b = 100
;Value: done

1 ]=> (forget-value! a 'user)

Probe: a = ?
Probe: b = ?
;Value: done

1 ]=> (set-value! b 12.345 'user)

Probe: b = 12.345
Probe: a = 3.513545218152173
;Value: done

1 ]=> (forget-value! b 'user)

Probe: b = ?
Probe: a = ?
;Value: done

1 ]=> (set-value! a 12.345 'user)

Probe: a = 12.345
Probe: b = 152.39902500000002
;Value: done

1 ]=> (forget-value! a 'user)

Probe: a = ?
Probe: b = ?
;Value: done

0 コメント:

コメントを投稿