Skip to content

Commit 70d3e35

Browse files
committed
Add implementation of exercise 3-37.
1 parent 554f4cb commit 70d3e35

File tree

2 files changed

+83
-1
lines changed

2 files changed

+83
-1
lines changed

README.org

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@
2525
习题完成情况:
2626
- 章节一: 43/46
2727
- 章节二: 88/97
28-
- 章节三: 36/82
28+
- 章节三: 37/82
2929
- 章节四: TODO
3030
- 章节五: TODO
3131
* 运行

chapter3/exercise3-37.rkt

Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,82 @@
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

Comments
 (0)