Chapter 3, Modularity, Objects, and State

Exercise 3.37


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
30
31
32
33
34
35
(define (c+ x y)
  (let ((z (make-connector)))
    (adder x y z)
    z))


(define (c- x y)
  (let ((z (make-connector)))
    (adder y z x)
    z))

(define (c* x y)
  (let ((z (make-connector)))
    (multiplier x y z)
    z))

(define (c/ x y)
  (let ((z (make-connector)))
    (multiplier y z x)
    z))

(define (cv x)
  (let ((z (make-connector)))
    (constant x z)
    z))

(define (celsius-fahrenheit-converter-new x)
  (c+ (c* (c/ (cv 9) (cv 5))
          x)
      (cv 32)))
(define CC (make-connector))
(define FF (celsius-fahrenheit-converter-new CC))

(probe "Celsius temp" CC)
(probe "Fahrenheit temp" FF)

Output:

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
1 ]=> (set-value! CC 25 'user)

Probe: Celsius temp = 25
Probe: Fahrenheit temp = 77
;Value: done

1 ]=> (set-value! FF 212 'user)

;Contradiction (77 212)
;To continue, call RESTART with an option number:
; (RESTART 1) => Return to read-eval-print level 1.

2 error> (forget-value! CC 'user)

Probe: Celsius temp = ?
Probe: Fahrenheit temp = ?
;Value: done

2 error> (restart 1)

;Abort!

1 ]=> (set-value! FF 212 'user)

Probe: Fahrenheit temp = 212
Probe: Celsius temp = 100
;Value: done