Skip to content

Commit e5a139b

Browse files
committed
Delete duplicated functions
1 parent 7ebfbe2 commit e5a139b

File tree

4 files changed

+92
-100
lines changed

4 files changed

+92
-100
lines changed

chapter2/ch2lib.scm

Lines changed: 22 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,5 @@
11
#lang racket
22

3-
(provide put get attach-tag type-tag contents apply-generic square)
4-
5-
(define (apply-generic op . args)
6-
(let ((type-tags (map type-tag args)))
7-
(let ((proc (get op type-tags)))
8-
(if proc
9-
(apply proc (map contents args))
10-
(error "No method for these types -- APPLY-GENERIC"
11-
(list op type-tags))))))
12-
133
(define (square x) (* x x))
144

155
(define *op-table* (make-hash))
@@ -21,17 +11,30 @@
2111
(hash-ref! *op-table* (list op type) #f))
2212

2313
(define (attach-tag type-tag contents)
24-
(cons type-tag contents))
14+
(if (number? contents)
15+
contents
16+
(cons type-tag contents)))
2517

2618
(define (type-tag datum)
27-
(if (pair? datum)
28-
(car datum)
29-
(error "Bad tagged datum -- TYPE-TAG" datum)))
19+
(cond ((number? datum) 'scheme-number)
20+
((pair? datum)(car datum))
21+
(else (error "Bad tagged datum -- TYPE-TAG" datum)))
22+
)
3023

3124
(define (contents datum)
32-
(if (pair? datum)
33-
(cdr datum)
34-
(error "Bad tagged datum -- CONTENTS" datum)))
25+
(cond ((number? datum) datum)
26+
((pair? datum)(cdr datum))
27+
(else
28+
(error "Bad tagged datum -- CONTENTS" datum))))
29+
30+
(define (apply-generic op . args)
31+
(let ((type-tags (map type-tag args)))
32+
(let ((proc (get op type-tags)))
33+
(if proc
34+
(apply proc (map contents args))
35+
(error "No method for these types -- APPLY-GENERIC"
36+
(list op type-tags))))))
37+
3538

3639
(define (install-rectangular-package)
3740
;; internal procedures
@@ -102,3 +105,5 @@
102105

103106
'done
104107
)
108+
(provide *op-table*)
109+
(provide put get attach-tag type-tag contents apply-generic square)

chapter2/generic_operation.scm

Lines changed: 47 additions & 65 deletions
Original file line numberDiff line numberDiff line change
@@ -1,44 +1,12 @@
11
#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")
343

354
(define (add x y) (apply-generic 'add x y))
365
(define (sub x y) (apply-generic 'sub x y))
376
(define (mul x y) (apply-generic 'mul x y))
387
(define (div x y) (apply-generic 'div x y))
398

409
;;; regular number
41-
4210
(define (install-scheme-number-package)
4311
(define (tag x)
4412
(attach-tag 'scheme-number x))
@@ -76,22 +44,22 @@
7644

7745
(define (add-rat x y)
7846
(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))))
8149

8250
(define (sub-rat x y)
8351
(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))))
8654

8755
(define (mul-rat x y)
8856
(make-rat (* (numer x) (numer y))
89-
(* (denom x) (denom y))))
57+
(* (denom x) (denom y))))
9058

9159
(define (div-rat x y)
9260
(make-rat (* (numer x) (denom y))
93-
(* (denom x) (numer y))))
94-
61+
(* (denom x) (numer y))))
62+
9563
;; interface to rest of the system
9664
(define (tag x) (attach-tag 'rational x))
9765

@@ -126,7 +94,7 @@
12694

12795
(define (magnitude z)
12896
(sqrt (+ (square (real-part z))
129-
(square (imag-part z)))))
97+
(square (imag-part z)))))
13098

13199
(define (angle z)
132100
(atan (imag-part z) (real-part z)))
@@ -150,7 +118,7 @@
150118
(put 'make-from-mag-ang 'rectangular (lambda (r a) (tag (make-from-mag-ang r a))))
151119

152120
'done
153-
)
121+
)
154122

155123
(define (install-polar-package)
156124
;; internal procedures
@@ -168,7 +136,7 @@
168136

169137
(define (make-from-real-imag x y)
170138
(cons (sqrt (+ (square x) (square y)))
171-
(atan y x)))
139+
(atan y x)))
172140

173141
;; interface to the rest of the system
174142
(define (tag x)(attach-tag 'polar x))
@@ -203,19 +171,19 @@
203171

204172
(define (add-complex z1 z2)
205173
(make-from-real-imag (+ (real-part z1) (real-part z2))
206-
(+ (imag-part z1) (imag-part z2))))
174+
(+ (imag-part z1) (imag-part z2))))
207175

208176
(define (sub-complex z1 z2)
209177
(make-from-real-imag (- (real-part z1) (real-part z2))
210-
(- (imag-part z1) (imag-part z2))))
178+
(- (imag-part z1) (imag-part z2))))
211179

212180
(define (mul-complex z1 z2)
213181
(make-from-mag-ang (* (magnitude z1) (magnitude z2))
214-
(+ (angle z1) (angle z2))))
182+
(+ (angle z1) (angle z2))))
215183

216184
(define (div-complex z1 z2)
217185
(make-from-mag-ang (/ (magnitude z1) (magnitude z2))
218-
(- (angle z1) (angle z2))))
186+
(- (angle z1) (angle z2))))
219187

220188
;; interface to rest of the system
221189
(define (tag z) (attach-tag 'complex z))
@@ -250,29 +218,43 @@
250218
((get 'make-from-mag-ang 'complex)r a))
251219

252220
;;; 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)
258226

259227

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)
264232

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)
269237

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)
274242

275243
(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)
277244
(provide magnitude angle real-part imag-part)
278245
(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+
)

chapter2/huffman-tree.scm

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
#lang racket
12
(define (make-leaf symbol weight)
23
(list 'leaf symbol weight))
34

@@ -59,3 +60,5 @@
5960
(adjoin-set (make-leaf (car pair) ; symbol
6061
(cadr pair)) ; weight
6162
(make-leaf-set (cdr pairs))))))
63+
64+
(provide leaf? make-code-tree make-leaf decode left-branch right-branch adjoin-set make-leaf-set symbol-leaf weight-leaf weight symbols)

chapter2/poly.rkt

Lines changed: 20 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
#lang racket
2+
(require "ch2lib.scm")
23
(require "generic_operation.scm")
34

45
(define (variable? x) (symbol? x))
@@ -10,26 +11,27 @@
1011

1112
(define (term-list p) (cdr p))
1213

13-
(define (install-polynomial-package)
14-
;; internal procedures
14+
;; representation of poly
15+
(define (make-poly variable term-list)
16+
(cons variable term-list))
17+
18+
(define (add-poly p1 p2)
19+
(if (same-variable? (variable p1) (variable p2))
20+
(make-poly (variable p1)
21+
(add-terms (term-list p1)
22+
(term-list p2)))
23+
(error "Polys not in same var -- ADD-POLY" (list p1 p2))))
1524

16-
;; representation of poly
17-
(define (make-poly variable term-list)
18-
(cons variable term-list))
25+
(define (mul-poly p1 p2)
26+
(if (same-variable? (variable p1) (variable p2))
27+
(make-poly (variable p1)
28+
(mul-terms (term-list p1)
29+
(term-list p2)))
30+
(error "Polys not in same var -- MUL-POLY" (list p1 p2))))
1931

20-
(define (add-poly p1 p2)
21-
(if (same-variable? (variable p1) (variable p2))
22-
(make-poly (variable p1)
23-
(add-terms (term-list p1)
24-
(term-list p2)))
25-
(error "Polys not in same var -- ADD-POLY" (list p1 p2))))
32+
(define (install-polynomial-package)
33+
;; internal procedures
2634

27-
(define (mul-poly p1 p2)
28-
(if (same-variable? (variable p1) (variable p2))
29-
(make-poly (variable p1)
30-
(mul-terms (term-list p1)
31-
(term-list p2)))
32-
(error "Polys not in same var -- MUL-POLY" (list p1 p2))))
3335

3436
;; interface to the rest of the system.
3537
(define (tag p) (attach-tag 'polynomial p))
@@ -102,4 +104,4 @@
102104
(mul (coeff t1) (coeff t2)))
103105
(mul-term-by-all-terms t1 (rest-terms L))))))
104106

105-
(provide empty-termlist? =zero? first-term rest-terms coeff term-list adjoin-term variable make-term)
107+
(provide empty-termlist? =zero? first-term rest-terms coeff term-list adjoin-term variable make-term order make-poly add-poly)

0 commit comments

Comments
 (0)