3.37 Exercise 3.37
This is what we are given as an example of a more expressive procedure for creating adder connectors:
(define (c+ x y) (let ((z (make-connector))) (adder x y z) z))
Note that it only takes the two input wires, creating the output wire itself and returning it as a result for more easy composition. We can do similarly for the other operators:
(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 v) (let ((z (make-connector))) (constant v z) z))
We can then define a Celsius-Fahrenheit converter as they have. Note that, due to the semantics of how c/ is used below, y had to be used as an argument to multiplier before x.
(define (celsius-fahrenheit-converter x) (c+ (c* (c/ (cv 9) (cv 5)) x) (cv 32))) (define C (make-connector)) (define F (celsius-fahrenheit-converter C))
A REPL session shows that this works:
> (probe "F" F) #<procedure>
> (probe "C" C) #<procedure>
> (set-value! F 32 'user)
Probe: F = 32
Probe: C = 0
'done
> (forget-value! F 'user)
Probe: F = ?
Probe: C = ?
'done
> (set-value! C 100 'user)
Probe: C = 100
Probe: F = 212
'done
> (forget-value! C 'user)
Probe: C = ?
Probe: F = ?
'done
> (set-value! F 75 'user)
Probe: F = 75
Probe: C = 215/9
'done