SICP 問題2.75(メッセージパッシングの概念でmake-from-mag-angを実装)

問題

構成子make-from-mag-angをメッセージパッシングの流儀で実装せよ。この手続きは上のmake-from-real-imagに似ているはずだ。

解答

似た感じで作りゃいいわけだ。

(define (make-from-mag-ang r a)
  (define (dispatch op)
    (cond ((eq? op 'real-part)
	   (* r (cos a)))
	  ((eq? op 'imag-part)
	   (* r (sin a)))
	  ((eq? op 'magnitude)
	   r)
	  ((eq? op 'angle)
	   a)
	  (else
	   (error "Unknow op -- MAKE-FROM-MAG-ANG" op))))
  dispatch)

こんな感じ。じゃ実験。


gosh> (define pi 3.141592)
pi
gosh> pi
3.141592
gosh> (define complex3 (make-from-mag-ang 1 (/ pi 4)))
complex3
gosh> (complex3 'real-part)
0.7071068967259818
gosh> (complex3 'imag-part)
0.7071066656470943
gosh> (complex3 'magnitude)
1
gosh> (complex3 'angle)
0.785398
gosh> (define complex4 (make-from-mag-ang 1 (/ pi 3)))
complex4
gosh> (complex4 'real-part)
0.5000001886751096
gosh> (complex4 'imag-part)
0.8660252948527859
gosh> (complex4 'magnitude)
1
gosh> (complex4 'angle)
1.0471973333333333
gosh>
少数の確認メンドクセ。まぁ大体合ってそう。complex4とか。