SICP Exercise 2.80
Question
Define a generic predicate =zero?
that tests if its argument is zero, and
install it in the generic arithmetic package. This operation should work for
ordinary numbers, rational numbers, and complex numbers.
Answer
First, we need to define the generic function:
(define (=zero? x) (apply-generic 'zero x))
Then, we must add it to our three installation packages: the simple numbers, rational numbers and complex numbers.
A simple number is zero if it is equal to \(0\), a rational number if its numerator is equal to \(0\) and a complex number if both its real and its imaginary part are equal to \(0\).
; scheme numbers
(put '=zero? '(scheme-number)
(λ (x) (tag (= x 0))))
; rational numbers
(put '=zero? '(rational)
(λ (x) (tag (= 0 (numer x)))))
; complex numbers
(put '=zero? '(complex)
(λ (x) (tag (and (= 0 (real-part x))
(= 0 (imag-part x))))))