|
1 | 1 | #lang racket
|
2 |
| - |
3 |
| -(define (apply-generic op . args) |
4 |
| - (let ((type-tags (map type-tag args))) |
5 |
| - (let ((proc (get op type-tags))) |
6 |
| - (if proc |
7 |
| - (apply proc (map contents args)) |
8 |
| - (error "No method for these types -- APPLY-GENERIC" |
9 |
| - (list op type-tags)))))) |
10 |
| - |
11 |
| -(define (square x) (* x x)) |
12 |
| - |
13 |
| -(define *op-table* (make-hash)) |
14 |
| - |
15 |
| -(define (put op type proc) |
16 |
| - (hash-set! *op-table* (list op type) proc)) |
17 |
| - |
18 |
| -(define (get op type) |
19 |
| - (hash-ref! *op-table* (list op type) #f)) |
20 |
| - |
21 |
| -(define (attach-tag type-tag contents) |
22 |
| - (cons type-tag contents)) |
23 |
| - |
24 |
| -(define (type-tag datum) |
25 |
| - (if (pair? datum) |
26 |
| - (car datum) |
27 |
| - (error "Bad tagged datum -- TYPE-TAG" datum))) |
28 |
| - |
29 |
| -(define (contents datum) |
30 |
| - (if (pair? datum) |
31 |
| - (cdr datum) |
32 |
| - (error "Bad tagged datum -- CONTENTS" datum))) |
33 |
| -;;; |
| 2 | +(require "ch2lib.scm") |
34 | 3 |
|
35 | 4 | (define (add x y) (apply-generic 'add x y))
|
36 | 5 | (define (sub x y) (apply-generic 'sub x y))
|
37 | 6 | (define (mul x y) (apply-generic 'mul x y))
|
38 | 7 | (define (div x y) (apply-generic 'div x y))
|
39 | 8 |
|
40 | 9 | ;;; regular number
|
41 |
| - |
42 | 10 | (define (install-scheme-number-package)
|
43 | 11 | (define (tag x)
|
44 | 12 | (attach-tag 'scheme-number x))
|
|
76 | 44 |
|
77 | 45 | (define (add-rat x y)
|
78 | 46 | (make-rat (+ (* (numer x) (denom y))
|
79 |
| - (* (numer y) (denom x))) |
80 |
| - (* (denom x) (denom y)))) |
| 47 | + (* (numer y) (denom x))) |
| 48 | + (* (denom x) (denom y)))) |
81 | 49 |
|
82 | 50 | (define (sub-rat x y)
|
83 | 51 | (make-rat (- (* (numer x) (denom y))
|
84 |
| - (* (numer y) (denom x))) |
85 |
| - (* (denom x) (denom y)))) |
| 52 | + (* (numer y) (denom x))) |
| 53 | + (* (denom x) (denom y)))) |
86 | 54 |
|
87 | 55 | (define (mul-rat x y)
|
88 | 56 | (make-rat (* (numer x) (numer y))
|
89 |
| - (* (denom x) (denom y)))) |
| 57 | + (* (denom x) (denom y)))) |
90 | 58 |
|
91 | 59 | (define (div-rat x y)
|
92 | 60 | (make-rat (* (numer x) (denom y))
|
93 |
| - (* (denom x) (numer y)))) |
94 |
| - |
| 61 | + (* (denom x) (numer y)))) |
| 62 | + |
95 | 63 | ;; interface to rest of the system
|
96 | 64 | (define (tag x) (attach-tag 'rational x))
|
97 | 65 |
|
|
126 | 94 |
|
127 | 95 | (define (magnitude z)
|
128 | 96 | (sqrt (+ (square (real-part z))
|
129 |
| - (square (imag-part z))))) |
| 97 | + (square (imag-part z))))) |
130 | 98 |
|
131 | 99 | (define (angle z)
|
132 | 100 | (atan (imag-part z) (real-part z)))
|
|
150 | 118 | (put 'make-from-mag-ang 'rectangular (lambda (r a) (tag (make-from-mag-ang r a))))
|
151 | 119 |
|
152 | 120 | 'done
|
153 |
| - ) |
| 121 | + ) |
154 | 122 |
|
155 | 123 | (define (install-polar-package)
|
156 | 124 | ;; internal procedures
|
|
168 | 136 |
|
169 | 137 | (define (make-from-real-imag x y)
|
170 | 138 | (cons (sqrt (+ (square x) (square y)))
|
171 |
| - (atan y x))) |
| 139 | + (atan y x))) |
172 | 140 |
|
173 | 141 | ;; interface to the rest of the system
|
174 | 142 | (define (tag x)(attach-tag 'polar x))
|
|
203 | 171 |
|
204 | 172 | (define (add-complex z1 z2)
|
205 | 173 | (make-from-real-imag (+ (real-part z1) (real-part z2))
|
206 |
| - (+ (imag-part z1) (imag-part z2)))) |
| 174 | + (+ (imag-part z1) (imag-part z2)))) |
207 | 175 |
|
208 | 176 | (define (sub-complex z1 z2)
|
209 | 177 | (make-from-real-imag (- (real-part z1) (real-part z2))
|
210 |
| - (- (imag-part z1) (imag-part z2)))) |
| 178 | + (- (imag-part z1) (imag-part z2)))) |
211 | 179 |
|
212 | 180 | (define (mul-complex z1 z2)
|
213 | 181 | (make-from-mag-ang (* (magnitude z1) (magnitude z2))
|
214 |
| - (+ (angle z1) (angle z2)))) |
| 182 | + (+ (angle z1) (angle z2)))) |
215 | 183 |
|
216 | 184 | (define (div-complex z1 z2)
|
217 | 185 | (make-from-mag-ang (/ (magnitude z1) (magnitude z2))
|
218 |
| - (- (angle z1) (angle z2)))) |
| 186 | + (- (angle z1) (angle z2)))) |
219 | 187 |
|
220 | 188 | ;; interface to rest of the system
|
221 | 189 | (define (tag z) (attach-tag 'complex z))
|
|
250 | 218 | ((get 'make-from-mag-ang 'complex)r a))
|
251 | 219 |
|
252 | 220 | ;;; test case
|
253 |
| -(install-scheme-number-package) |
254 |
| -(install-complex-package) |
255 |
| -(install-rational-package) |
256 |
| -(install-polar-package) |
257 |
| -(install-rectangular-package) |
| 221 | +;; (install-scheme-number-package) |
| 222 | +;; (install-complex-package) |
| 223 | +;; (install-rational-package) |
| 224 | +;; (install-polar-package) |
| 225 | +;; (install-rectangular-package) |
258 | 226 |
|
259 | 227 |
|
260 |
| -(add (make-scheme-number 10) (make-scheme-number 5)) ;=> (scheme-number . 15) |
261 |
| -(sub (make-scheme-number 10) (make-scheme-number 5)) ;=> (scheme-number . 5) |
262 |
| -(mul (make-scheme-number 10) (make-scheme-number 5)) ;=> (scheme-number . 50) |
263 |
| -(div (make-scheme-number 10) (make-scheme-number 5)) ;=> (scheme-number . 2) |
| 228 | +;; (add (make-scheme-number 10) (make-scheme-number 5)) ;=> (scheme-number . 15) |
| 229 | +;; (sub (make-scheme-number 10) (make-scheme-number 5)) ;=> (scheme-number . 5) |
| 230 | +;; (mul (make-scheme-number 10) (make-scheme-number 5)) ;=> (scheme-number . 50) |
| 231 | +;; (div (make-scheme-number 10) (make-scheme-number 5)) ;=> (scheme-number . 2) |
264 | 232 |
|
265 |
| -(add (make-rational 1 2) (make-rational 1 3)) ;=> (rational 5 . 6) |
266 |
| -(sub (make-rational 1 2) (make-rational 1 3)) ;=> (rational 1 . 6) |
267 |
| -(mul (make-rational 1 2) (make-rational 1 3)) ;=> (rational 1 . 6) |
268 |
| -(div (make-rational 1 2) (make-rational 1 3)) ;=> (rational 3 . 2) |
| 233 | +;; (add (make-rational 1 2) (make-rational 1 3)) ;=> (rational 5 . 6) |
| 234 | +;; (sub (make-rational 1 2) (make-rational 1 3)) ;=> (rational 1 . 6) |
| 235 | +;; (mul (make-rational 1 2) (make-rational 1 3)) ;=> (rational 1 . 6) |
| 236 | +;; (div (make-rational 1 2) (make-rational 1 3)) ;=> (rational 3 . 2) |
269 | 237 |
|
270 |
| -(add (make-complex-from-real-imag 3 4) (make-complex-from-mag-ang 10 1)) ;=> (complex rectangular -3.921861725181672 . -4.540814971847569) |
271 |
| -(sub (make-complex-from-real-imag 3 4) (make-complex-from-mag-ang 10 1)) ;=> (complex rectangular 0.0 . 0.0) |
272 |
| -(mul (make-complex-from-real-imag 3 4) (make-complex-from-mag-ang 10 1)) ;=> (complex polar 9 . 8) |
273 |
| -(div (make-complex-from-real-imag 3 4) (make-complex-from-mag-ang 10 1)) ;=> (complex polar 1 . 0) |
| 238 | +;; (add (make-complex-from-real-imag 3 4) (make-complex-from-mag-ang 10 1)) ;=> (complex rectangular -3.921861725181672 . -4.540814971847569) |
| 239 | +;; (sub (make-complex-from-real-imag 3 4) (make-complex-from-mag-ang 10 1)) ;=> (complex rectangular 0.0 . 0.0) |
| 240 | +;; (mul (make-complex-from-real-imag 3 4) (make-complex-from-mag-ang 10 1)) ;=> (complex polar 9 . 8) |
| 241 | +;; (div (make-complex-from-real-imag 3 4) (make-complex-from-mag-ang 10 1)) ;=> (complex polar 1 . 0) |
274 | 242 |
|
275 | 243 | (provide install-scheme-number-package install-complex-package install-rational-package install-rectangular-package install-polar-package make-scheme-number make-rational make-complex-from-mag-ang make-complex-from-real-imag)
|
276 |
| -(provide attach-tag type-tag contents get put apply-generic) |
277 | 244 | (provide magnitude angle real-part imag-part)
|
278 | 245 | (provide add sub mul div)
|
| 246 | + |
| 247 | +(module+ test |
| 248 | + (require rackunit) |
| 249 | + (require rackunit/text-ui) |
| 250 | + |
| 251 | + (install-scheme-number-package) |
| 252 | + |
| 253 | + (define scheme-number-tests |
| 254 | + (test-suite |
| 255 | + "Tests for make-shceme-number" |
| 256 | + (check-equal? (make-scheme-number 10) (attach-tag 'scheme-number 10) "Expected (scheme-number . 10) for 10") |
| 257 | + )) |
| 258 | + |
| 259 | + (run-tests scheme-number-tests) |
| 260 | + ) |
0 commit comments