Chapter 3, Modularity, Objects, and State
Exercise 3.35
Here goes the completed code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
(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)
;; Some initializations for testing
(define X (make-connector))
(define SQR (make-connector))
(squarer X SQR)
(probe "X" X)
(probe "SQR" SQR)
Output:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
1 ]=> (set-value! SQR 169 'ovais)
Probe: SQR = 169
Probe: X = 13
;Value: done
1 ]=> (forget-value! SQR 'ovais)
Probe: SQR = ?
Probe: X = ?
;Value: done
1 ]=> (set-value! X 25 'ovais)
Probe: X = 25
Probe: SQR = 625
;Value: done
1 ]=>