3.35 Exercise 3.35
If we’re going to define a squarer, we’re going to have to invent a new primitive that knows what to do when either one of the connectors has no value. We can complete the definition of this primitive started in the exercise like this:
(define (squarer a b) (define (process-new-value) (cond ((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))) ((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 -- SQUARER" request)))) (connect a me) (connect b me) me)
The same REPL session as before shows that this works correctly:
> (define A (make-connector)) > (define B (make-connector)) > (squarer A B) #<procedure>
> (probe "A" A) #<procedure>
> (probe "B" B) #<procedure>
> (set-value! A 2 'user)
Probe: A = 2
Probe: B = 4
'done
> (forget-value! A 'user)
Probe: A = ?
Probe: B = ?
'done
> (set-value! B 25 'user)
Probe: B = 25
Probe: A = 5
'done