開発環境
- OS X Lion - Apple(OS)
- Emacs、BBEdit - Bare Bones Software, Inc. (Text Editor)
- プログラミング言語: MIT/GNU Scheme
計算機プログラムの構造と解釈(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 コメント:
コメントを投稿