SICP 読み (61) 2.5.1 汎用算術演算
問題 2.79 の rectangular と polar が eq? なソレでハマり中。
属性の意味も値も異なるオブジェクトの等価性をナニするにはどうすれば良いのか。
ってか良く考えれば
で実装してるという事は complex なソレではなくって rectangular と polar パケジの中で手続き定義、という理解で進めます。(を
で、でっち上げた試験が以下。
("equ? test (rectangular - rectangular)" (let ((t1 (make-complex-from-real-imag 2 1)) (t2 (make-complex-from-real-imag 2 1)) (t3 (make-complex-from-real-imag 1 1))) (assert-true (equ? t1 t2)) (assert-false (equ? t1 t3)) ) ) ("equ? test (polar - polar)" (let ((t1 (make-complex-from-mag-ang (sqrt 3) (/ pi 6))) (t2 (make-complex-from-mag-ang (sqrt 3) (/ pi 6))) (t3 (make-complex-from-mag-ang 2 (/ pi 4)))) (assert-true (equ? t1 t2)) (assert-false (equ? t1 t3)) ) )
カワの剥ぎかたって問題 2.77 と同じと見て良いんだろうな。という事は complex パケジで
(put 'equ? '(complex complex) equ?)
としておいて、例えば rectangular だと
(put 'equ? '(rectangular rectangular) equ-ractangular?) (define (equ-rectangular? x y) (and (= (real-part x) (real-part y)) (= (imag-part x) (imag-part y))))
で良いのかなぁ。この方針で試験をしてみよう。(polar は略)
で、試験はパス。型が異なるソレな等価述語の実装をスルーしているあたり、微妙ですがこのままとしておきます。(確認は別途)