summaryrefslogtreecommitdiff
path: root/coding-exercises/2/83/install.rkt
blob: 0cd8bbf55962cd16a7757e28ecc956c44b6c5ec0 (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
#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
         =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"
         "../../../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 put get)
(install-real put get)
(install-complex apply-fn get put)

(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))
(define test-complex-polar (make-complex-rect 1 2))

;; polynomial
(define (make-polynomial var terms)
  ((get 'make 'polynomial) var terms))

;; 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 (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))