summaryrefslogtreecommitdiff
path: root/coding-exercises/2/83/install.rkt
blob: fcaff0be90b85ac44ed709a3ad71d0b0318edd02 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
#lang racket
(provide install-arithmetic-package
         make-integer
         test-integer
         make-rat
         test-rat
         make-real
         test-real
         make-complex
         test-complex
         make-complex-rect
         test-complex-rect
         make-complex-polar
         ;test-complex-polar
         term
         dense-termlist
         sparse-termlist
         make-polynomial
         ; test-poly1
         ; test-poly2
         ; test-poly3
         =zero?
         equ?
         add
         sub
         mul
         div
         sinme
         cosme
         atanme
         sqrme
         sqrtme
         raiseme
         dropme)

(require "./install-integer.rkt"
         "./install-rational.rkt"
         "./install-real.rkt"
         "./install-complex.rkt"
         "./polynomials.rkt"
         "../../../shared/data-directed-programming.rkt")


(define pkg (make-dispatch-table))
(define get (getter pkg))
(define put (putter pkg))
(define print-tbl (printer pkg))
(define apply-fn (make-apply-with-raising-and-drop
                   get))

(install-integer put get)
(install-rational get put apply-fn)
(install-real put get)
(install-complex apply-fn get put)
(install-polynomial get put apply-fn)

(define (install-arithmetic-package)
  (list get put apply-fn))

;; constructors
;; integer
(define (make-integer n)
  ((get 'make 'integer) n))
(define test-integer (make-integer 3))

;; rational
(define (make-rat n d)
  ((get 'make 'rational) n d))
(define test-rat (make-rat 5 2))

;; real
(define (make-real n)
  ((get 'make 'real) n))
(define test-real (make-real 1.5))

;; complex
(define (make-complex x y)
  ((get 'make-from-real-imag 'complex) x y))
(define (make-complex-rect x y)
  ((get 'make-from-real-imag 'complex) x y))
(define (make-complex-polar x y)
  ((get 'make-from-mag-ang 'complex) x y))
(define test-complex (make-complex 1 2))
(define test-complex-rect (make-complex-rect 1 2))
(display (apply-fn 'magnitude test-complex))
;; (define test-complex-polar (make-complex-polar (apply-fn 'magnitude test-complex) (apply-fn 'angle test-complex)))

;; polynomial
(define (term order coeff)
  ((get 'make-from-order-coeff 'term) order coeff))
(define (sparse-termlist . terms)
  ((get 'make-from-terms 'sparse-termlist) terms))
(define (dense-termlist . terms)
  ((get 'make-from-terms 'dense-termlist) terms))
(define (make-polynomial var terms)
  ((get 'make 'polynomial) var terms))
; (define test-poly1 (make-polynomial 'x (sparse-termlist
;                                          (term 1 test-integer)))
; (define test-poly2 (make-polynomial 'x (sparse-termlist
;                                          (term 100 test-complex)
;                                          (term 2 test-real)
;                                          (term 1 test-rat)
;                                          (term 0 test-integer))))
; (define test-poly3 (make-polynomial 'x (sparse-termlist
;                                          (term 50 test-rat)
;                                          (term 0 2))))

;; generic methods
(define (equ? a1 a2)
  (apply-fn 'equ? a2))
(define (=zero? datum)
  (apply-fn '=zero? datum))
(define (add a1 a2)
  (apply-fn 'add a1 a2))
(define (neg a)
  (apply-fn 'neg a))
(define (sub a1 a2)
  (apply-fn 'sub a1 a2))
(define (mul a1 a2)
  (apply-fn 'mul a1 a2))
(define (div a1 a2)
  (apply-fn 'div a1 a2))
(define (raiseme datum)
  (apply-fn 'raise datum))
(define (dropme datum)
  (apply-fn 'project datum))
(define (sqrme datum)
  (apply-fn 'sqr datum))
(define (sqrtme datum)
  (apply-fn 'sqrt datum))
(define (cosme datum)
  (apply-fn 'cos datum))
(define (sinme datum)
  (apply-fn 'sin datum))
(define (atanme a1 a2)
  (apply-fn 'atan a2))