SICP問題2.75

メッセージパッシング(message passing) (教科書で定義)

(define (make-from-real-imag x y)
  (define (dispatch op)
    (cond ((eq? op 'real-part) x)
	  ((eq? op 'imag-part) y)
	  ((eq? op 'magnitude)
	   (sqrt (+ (square x) (square y))))
	  ((eq? op 'angle) (atan y x))
	  (else
	   (error "Unknown op -- MAKE-FROM-REAL-IMAG" op))))
  dispatch)
(define (apply-generic op arg) (arg op))

問題。構成子 make-from-mag-ang をメッセージパッシングの流儀で実装せよ。

(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 "Unknown op -- MAKE-FROM-MAG-ANG" op))))
  dispatch)

テスト

(define z (make-from-mag-ang 1.0 0.3))
; z
(z 'real-part)
; 0.955336489125606
(z 'imag-part)
; 0.29552020666133955
(z 'magnitude)
; 1.0
(z 'angle)
; 0.3