次はゼロかどうか判定する関数作るよー。
rectangularパッケージ。
(x,y)が両方とも0のときzeroですね。
(define (zero? z) (and (= (real-part z) 0) (= (imag-part z) 0)))
(put 'zero? '(rectangular) (lambda (z) (zero? z)))
polarパッケージは絶対値が0のときzeroだ!
(define (zero? z) (= (magnitude z) 0))
(put 'zero? '(polar) (lambda (z) (zero? z)))
scheme-numberパッケージはそのまんまです。
(put 'equ? '(scheme-number) (lambda (x) (= x 0)))
rationalパッケージは分子がゼロのときゼロだ!
分母もゼロのときは構築子がはじくべき!!
(define (zero? x) (= (numer x) 0))
(put 'zero? '(rational) (lambda (z) (zero? z)))
complexパッケージ。下のレベルに渡すだけ。
(put 'zero? '(complex) (lambda (z) (zero? z)))
で、最後にこれ宣言しとく。
(define (zero? x) (apply-generic 'zero? x))
やったーできたよ!
(zero? (make-scheme-number 0)) ; #t (zero? (make-scheme-number 4)) ; #f (zero? (make-complex-from-real-imag 0 0)) ; #t (zero? (make-complex-from-real-imag 1 5)) ; #f (zero? (make-complex-from-mag-ang 0 3.14)) ; #t (zero? (make-complex-from-mag-ang 5 3.14)) ; #f (zero? (make-rational 0 5)) ; #t (zero? (make-rational 2 4)) ; #f