练习 3.37

先逐个实现所需的过程,然后再将它们组合在一起。

c+

c+ 的定义在练习中已经给出了:

;;; 37-c-add.scm

(define (c+ x y)
    (let ((sum (make-connector)))
        (adder x y sum)
        sum))

c-

根据公式 \(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*

c* 的定义就是对 multiplier 约束器的简单包装:

;;; 37-c-mul.scm

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

c/

根据公式 \(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

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

讨论

blog comments powered by Disqus