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