入力を二乗する回路素子(?) squarer をばっちし実装したろやないか!
問題 3-34 だと multiplier とかを組み合わせて Louis がヘンなことしてましたから,新しく,プリミティブな感じで作るみたいです.
squarer はこんな感じになる.
(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 (* (get-value a) (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 -- SQUARER" request)))) (connect a me) (connect b me) me)
テストするよー.まずは入力 a に 10 を入れる.もちろん b からの出力は になりますね.
(define a (make-connector)) (define b (make-connector)) (probe "A" a) (probe "B" b) (squarer a b) (set-value! a 10 'kiririmode) ; Probe: B = 100 ; Probe: A = 10
そしたら b に 10000 を入れてみようやないか!
これで a から が出たらおk
(forget-value! a 'kiririmode) (forget-value! b 'kiririmode) (set-value! b 10000 'kiririmode) ; Probe: A = 100.0 ; Probe: B = 10000done