|
| 1 | +#lang racket |
| 2 | +(require "constraints.rkt") |
| 3 | + |
| 4 | +;;; 有种 C++ 运算符重载的感觉了 |
| 5 | +(define (c+ x y) |
| 6 | + (let ((z (make-connector))) |
| 7 | + (adder x y z) |
| 8 | + z)) |
| 9 | + |
| 10 | +(define (c- x y) |
| 11 | + (let ((z (make-connector))) |
| 12 | + ;;; x - y = z 可以转换成 x = y + z |
| 13 | + (adder y z x) |
| 14 | + z)) |
| 15 | + |
| 16 | +(define (c* x y) |
| 17 | + (let ((z (make-connector))) |
| 18 | + (multiplier x y z) |
| 19 | + z)) |
| 20 | + |
| 21 | +(define (c/ x y) |
| 22 | + (let ((z (make-connector))) |
| 23 | + ;; x / y = z 可以转换成 x = y * z |
| 24 | + (multiplier y z x) |
| 25 | + z)) |
| 26 | + |
| 27 | +(define (cv x) |
| 28 | + (let ((z (make-connector))) |
| 29 | + (set-value! z x 'user) |
| 30 | + z)) |
| 31 | + |
| 32 | +(define (celsius-fahrenheit-converter x) |
| 33 | + (c+ (c* (c/ (cv 9) (cv 5)) |
| 34 | + x) |
| 35 | + (cv 32))) |
| 36 | + |
| 37 | +(module+ test |
| 38 | + (require rackunit) |
| 39 | + |
| 40 | + (test-case "Test for c+" |
| 41 | + (define a (make-connector)) |
| 42 | + (define b (make-connector)) |
| 43 | + (define sum (c+ a b)) |
| 44 | + (set-value! a 10 'user) |
| 45 | + (set-value! b 5 'user) |
| 46 | + (check-equal? (get-value sum) 15)) |
| 47 | + |
| 48 | + (test-case "Test for c-" |
| 49 | + (define a (make-connector)) |
| 50 | + (define b (make-connector)) |
| 51 | + (define c (c- a b)) |
| 52 | + (set-value! a 10 'user) |
| 53 | + (set-value! b 3 'user) |
| 54 | + (check-equal? (get-value c) 7)) |
| 55 | + |
| 56 | + (test-case "Test for c*" |
| 57 | + (define a (make-connector)) |
| 58 | + (define b (make-connector)) |
| 59 | + (define product (c* a b)) |
| 60 | + (set-value! a 10 'user) |
| 61 | + (set-value! b 5 'user) |
| 62 | + (check-equal? (get-value product) 50)) |
| 63 | + |
| 64 | + (test-case "Test for c/" |
| 65 | + (define a (make-connector)) |
| 66 | + (define b (make-connector)) |
| 67 | + (define c (c/ a b)) |
| 68 | + (set-value! a 6 'user) |
| 69 | + (set-value! b 2 'user) |
| 70 | + (check-equal? (get-value c) 3)) |
| 71 | + |
| 72 | + (test-case "Test for cv" |
| 73 | + (define c (cv 6)) |
| 74 | + (check-equal? (get-value c) 6)) |
| 75 | + |
| 76 | + (test-case "Test for celsius-fahrenheit-converter" |
| 77 | + (define C (make-connector)) |
| 78 | + (define F (celsius-fahrenheit-converter C)) |
| 79 | + (set-value! C 25 'user) |
| 80 | + (check-equal? (get-value F) 77) |
| 81 | + ) |
| 82 | + ) |
0 commit comments