next up previous
Next: 例題 Up: 4 Scheme言語を用いた抽象化プログラミング Previous: 4.5.4 データ指向型プログラミング

4.6 メッセージパッシング

ディパッチングを属性リストを手がかりにして行なう方法ではなく, データ自体がオペレーションを引数としてとるディスパッチ手続きとして定義 するという方法がさらに進んだ方法として使われます. つまり,

(define (make-rectangular x y)
  (define (dispatch m)
    ((eq? m 'real-part) x)
    ((eq? m 'imag-part) y)
    ((eq? m 'magnitude)
     (sqrt (+ (square x) (square y))))
    ((eq? m 'angle) (atan y x))
    (else
     (error "Unknown op -- MAKE-RECTANGULAR"
            m)))
  dispatch)
という具合にデータを作る手続きの中で ディスパッチ手続きをすべて定義しておき, その手続きをデータの変わりに返すわけです. データを作る手続きの引数(x y)がディスパッチ手続きの環境として保存され る(レキシカルクロージャを構成している)ため,データの内容を含んだディ スパッチ手続きが作られています. これにより,operate手続きは,

(define (operate op obj) (obj op))
というように,そのディスパッチ手続きに対して, オペレーションを渡すという簡単な定義になります.

generated through LaTeX2HTML. M.Inaba 平成18年5月6日