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 ]=>