summaryrefslogtreecommitdiff
path: root/coding-exercises/2/83
diff options
context:
space:
mode:
Diffstat (limited to 'coding-exercises/2/83')
-rw-r--r--coding-exercises/2/83/install-rational.rkt77
-rw-r--r--coding-exercises/2/83/install.rkt2
2 files changed, 55 insertions, 24 deletions
diff --git a/coding-exercises/2/83/install-rational.rkt b/coding-exercises/2/83/install-rational.rkt
index 337f38b..d1c94fc 100644
--- a/coding-exercises/2/83/install-rational.rkt
+++ b/coding-exercises/2/83/install-rational.rkt
@@ -2,35 +2,65 @@
(provide install-rational)
(require "../../../shared/data-directed-programming.rkt")
-(define (install-rational put get)
- ;; local methods
- (define (tagme x) (attach-tag 'rational x))
+(define (install-rational get put apply-fn)
+ ;; import generic methods
+ (define (=zero? a)
+ (apply-fn '=zero? a))
+ (define (equ? a b)
+ (apply-fn 'equ? a b))
+ (define (add a b)
+ (apply-fn 'add a b))
+ (define (neg a)
+ (apply-fn 'neg a))
+ (define (sub a b)
+ (apply-fn 'sub a b))
+ (define (mul a b)
+ (apply-fn 'mul a b))
+ (define (div a b)
+ (apply-fn 'div 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))
+
+ ;; constructor and selectors
+ (define (make-rat n d) (list n d))
(define (numer x) (car x))
- (define (denom x) (cdr x))
+ (define (denom x) (cadr x))
+
+ ;; ops
(define (add-rat x y)
- (make-rat (+ (* (numer x) (denom y))
- (* (numer y) (denom x)))
- (* (denom x) (denom y))))
+ (make-rat (add (mul (numer x) (denom y))
+ (mul (numer y) (denom x)))
+ (mul (denom x) (denom y))))
+
(define (neg-rat rat)
- (make-rat (- (numer rat))
+ (make-rat (neg (numer rat))
(denom rat)))
(define (sub-rat x y)
- (make-rat (- (* (numer x) (denom y))
- (* (numer y) (denom x)))
- (* (denom x) (denom y))))
+ (make-rat (sub (mul (numer x) (denom y))
+ (mul (numer y) (denom x)))
+ (mul (denom x) (denom y))))
+
(define (mul-rat x y)
- (make-rat (* (numer x) (numer y))
- (* (denom x) (denom y))))
+ (make-rat (mul (numer x) (numer y))
+ (mul (denom x) (denom y))))
(define (div-rat x y)
- (make-rat (* (numer x) (denom y))
- (* (denom x) (numer y))))
- (define (equ? x y)
- (and (= (numer x) (numer y))
- (= (denom x) (denom y))))
- (define (=zero? x)
- (equal? (numer x) 0))
+ (make-rat (mul (numer x) (denom y))
+ (mul (denom x) (numer y))))
+ (define (equ?-rat x y)
+ (and (equ? (numer x) (numer y))
+ (equ? (denom x) (denom y))))
+ (define (=zero?-rat x)
+ (=zero? (numer x)))
- (define (make-rat n d)
+ (define (make-rat-reduce-lowest-terms n d)
(define (sign x)
(cond
((and (< x 0) (< d 0)) (* -1 x))
@@ -47,6 +77,7 @@
(lambda (x y) (tagme (make-rat x y))))
;; interface
+ (define (tagme x) (attach-tag 'rational x))
(put 'add '(rational rational)
(lambda (x y) (tagme (add-rat x y))))
(put 'neg '(rational)
@@ -69,7 +100,7 @@
;; predicates
(put 'equ? '(rational rational)
- (lambda (x y) (equ? x y)))
+ (lambda (x y) (equ?-rat x y)))
(put '=zero? '(rational)
- (lambda (x) (=zero? x)))
+ (lambda (x) (=zero?-rat x)))
'done)
diff --git a/coding-exercises/2/83/install.rkt b/coding-exercises/2/83/install.rkt
index 0812405..5a4f72a 100644
--- a/coding-exercises/2/83/install.rkt
+++ b/coding-exercises/2/83/install.rkt
@@ -49,7 +49,7 @@
get))
(install-integer put get)
-(install-rational put get)
+(install-rational get put apply-fn)
(install-real put get)
(install-complex apply-fn get put)
(install-polynomial get put apply-fn)