summaryrefslogtreecommitdiff
path: root/coding-exercises/2/78/complex-polar.rkt
blob: 41a81a13df2ef726f63759d062377c687e0eb1fb (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
#lang racket
(provide install-polar-package)
(require "../../../shared/data-directed-programming.rkt")

(define (install-polar-package apply-fn put)
  ;; import methods
  (define (mul a b)
    (apply-fn 'mul a b))
  (define (cos a)
    (apply-fn 'cos a))
  (define (sin a)
    (apply-fn 'sin a))
  (define (sqr a)
    (apply-fn 'sqr a))
  (define (sqrt a)
    (apply-fn 'sqrt a))
  (define (atan a b)
    (apply-fn 'atan a b))

  ;; selectors
  (define (magnitude z)
      (car z)
    (define (angle z)
      (cdr z))
    (define (make-from-mag-ang r a)
      (cons r a)))

    ;; generic selectors
  (define (real-part z)
      (mul (magnitude z)
         (cos (angle z))))
  (define (imag-part z)
    (mul (magnitude z)
       (sin (angle z))))

    ;; constructor
  (define (make-from-real-imag x y)
    (cons (sqrt (+ (sqr x) (sqr y)))
          (atan y x)))

  ;; register in data-driven package)
  (define (typtag x)
    (attach-tag 'polar x))
  (put 'real-part '(polar) real-part)
  (put 'imag-part '(polar) imag-part)
  (put 'magnitude '(polar) magnitude)
  (put 'angle '(polar) angle)
  (put 'make-from-real-imag 'polar (lambda (x y) (typtag (make-from-real-imag x y))))
  (put 'make-from-mag-ang 'polar (lambda (r a) (typtag (make-from-mag-ang r a))))
  'done)