(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))というように,そのディスパッチ手続きに対して, オペレーションを渡すという簡単な定義になります.