先逐个实现所需的过程,然后再将它们组合在一起。
c+
的定义在练习中已经给出了:
;;; 37-c-add.scm
(define (c+ x y)
(let ((sum (make-connector)))
(adder x y sum)
sum))
根据公式 \(x + y = sum\) 、 \(sum - x = y\) 和 \(sum - y = x\) ,可以通过 adder
约束器来实现减法约束:
;;; 37-c-sub.scm
(define (c-sub x y)
(let ((diff (make-connector)))
(adder y diff x)
diff))
c*
的定义就是对 multiplier
约束器的简单包装:
;;; 37-c-mul.scm
(define (c* x y)
(let ((product (make-connector)))
(multiplier x y product)
product))
根据公式 \(p = q * r\) 、 \(r = p / q\) 和 \(q = p / r\) ,可以通过 multiplier
约束器来实现除法约束:
;;; 37-c-div.scm
(define (c/ p q)
(let ((r (make-connector)))
(multiplier q r p)
r))
celsius-fahrenheit-converter
的定义在练习中已经给出了,只要再给它载入所需的包,就可以进行测试了:
;;; 37-celsius-fahrenheit-converter.scm
(load "p205-constraint.scm")
(load "37-cv.scm")
(load "37-c-add.scm")
(load "37-c-sub.scm")
(load "37-c-mul.scm")
(load "37-c-div.scm")
(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))
1 ]=> (load "37-celsius-fahrenheit-converter.scm")
;Loading "37-celsius-fahrenheit-converter.scm"...
; Loading "p205-constraint.scm"...
; Loading "p201-constraint-interface.scm"... done
; Loading "p201-adder.scm"... done
; Loading "p202-multiplier.scm"... done
; Loading "p202-constant.scm"... done
; Loading "p203-probe.scm"... done
; Loading "p203-make-connector.scm"... done
; ... done
; Loading "37-cv.scm"... done
; Loading "37-c-add.scm"... done
; Loading "37-c-sub.scm"... done
; Loading "37-c-mul.scm"... done
; Loading "37-c-div.scm"... done
;... done
;Value: f
1 ]=> (probe "Celsius temp" C)
;Value 11: #[compound-procedure 11 me]
1 ]=> (probe "Fahrenheit temp" F)
;Value 12: #[compound-procedure 12 me]
1 ]=> (set-value! C 25 'user)
Probe: Celsius temp = 25
Probe: Fahrenheit temp = 77
;Value: done
1 ]=> (forget-value! C 'user)
Probe: Celsius temp = ?
Probe: Fahrenheit temp = ?
;Value: done
1 ]=> (set-value! F 212 'user)
Probe: Fahrenheit temp = 212
Probe: Celsius temp = 100
;Value: done