理系学生日記

おまえはいつまで学生気分なのか

問題2-80 (2.5.1 Generic Arithmetic Operations)

次はゼロかどうか判定する関数作るよー。

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