; rational number objects (define (newrat num dem) ; encapsulates numerator, denominator ; accessor methods are absolutely necessary (why?) ! (define (getnum) num) (define (getdem) dem) (define (invert) (let ((temp num)) (begin (set! num dem) (set! dem temp)))) (define (gcd a b) (if (= a 0) b (gcd (remainder b a) a))) (define (reduce) (let ((g (gcd num dem))) (begin (set! num (/ num g)) (set! dem (/ dem g))))) (define (rateq otherrat) (= (* num (otherrat 'getdem)) (* dem (otherrat 'getnum)))) (define (mult other) (newrat (* num (other 'getnum)) (* dem (other 'getdem)))) (lambda (method) ; body of newrat (interface function) (cond ((equal? method 'getnum) (getnum)) ((equal? method 'getdem) (getdem)) ((equal? method 'invert) (invert)) ((equal? method 'reduce) (reduce)) ((equal? method 'rateq) rateq) ((equal? method 'mult) mult) (#t 'error)))) ; non-object oriented style (rat is a parameter) (define (printrat r) ; note , r is a function! (begin (display (r 'getnum)) (display "/") (display (r 'getdem)))) (define r1 (newrat 1 2)) (define r2 (newrat 2 4)) ((r1 'rateq) r2) (define r3 ((r1 'mult) r2)) (r3 'reduce)