Exercise2-78 <---> Exercise2-80

Exercise 2.79

Define a generic equality predicate equ? that tests the equality of two numbers, and install it in the generic arithmetic package. This operation should work for ordinary numbers, rational numbers, and complex numbers.


Scheme solution:

(define (install-equality-package)
  (put 'equ? '(scheme-number scheme-number)
       (lambda (x y) ('scheme-number (= x y))))
  (put 'equ? '(rational rational)
       (lambda (x y) ('rational (and (= (numer x) (numer y))
                                     (= (denom x) (denom y))))))
  (put 'equ? '(complex complex)
       (lambda (z1 z2) ('complex (and (= (real-part z1) (real-part z2))
                                      (= (imag-part z1) (imag-part z2))))))
  'done)

Exercise2-78 <---> Exercise2-80


Comments

Implement equ? interface for each of the implementations: scheme-number, rational and complex.

;In install-scheme-number-package
  (put 'equ? '(scheme-number scheme-number)
       (lambda (x y) (= x y)))

;In install-rational-package
  (put 'equ? '(rational rational)
       (lambda (x y) (and (= (numer x) (numer y)) (= (denom x) (denom y)))))

;In install-complex-package
  (put 'equ? '(complex complex)
       (lambda (x y) (and (= (real-part x) (real-part y)) (= (imag-part x) (imag-part y)))))

To install the operation:

(define (equ? x y) (apply-generic 'equ? x y))
Posted by SriramDevadas at 2009-07-28 22:06:16

This method avoids useless computations for complex numbers represented in same forms (though it isn't sensible in this case).

(put 'equ? '(complex complex)
     (lambda (x y) (if (= (type-tag x) 'rectangular)
                       (and (= (real-part x) (real-part y))
                            (= (imag-part x) (imag-part y)))
                       (and (= (magnitude x) (magnitude y))
                            (= (angle x) (angle y))))))
Posted by EmilMelnicov at 2009-08-26 13:45:29

:) :)) :( ;) :\ |) X-( B) Markup

Exercise2-79 (last edited 2009-07-28 19:01:48 by SriramDevadas)