Skip to content

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.

(load "arithmetic-package.scm")

; (define (numer x) (apply-generic 'numer x))
; (define (denom x) (apply-generic 'denom x))

(define (equ? x y) (apply-generic 'equ? x y))

; Define `equ?` for each type
(put 'equ? '(scheme-number scheme-number) =) ; Equality operator for number
(put 'equ? '(rational_ rational_)   ; => Defined inside arithmetic-package itself
     (lambda (x y) 
        (and (= (numer x) (numer y))
             (= (denom x) (denom y)))))
(put 'equ? '(complex complex)
     (lambda (z1 z2)
        (and (= (real-part z1) (real-part z2))
             (= (imag-part z1) (imag-part z2)))))

; Testing
(equ? (make-scheme-number 42) (make-scheme-number 42)) ;#t
(equ? (make-scheme-number 42) (make-scheme-number 0))  ;#f
(equ? (make-rational 5 10) (make-rational 100 200)) ;#t
(equ? (make-complex-from-real-imag 1 2) (make-complex-from-real-imag 1 2)) ;#t