(put 'rectangular 'real-part real-part-rectangular) (put 'rectangular 'imag-part imag-part-rectangular) (put 'rectangular 'magnitude-part magnitude-part-rectangular) (put 'rectangular 'angle-part angle-part-rectangular) (put 'polar 'real-part real-part-polar) (put 'polar 'imag-part imag-part-polar) (put 'polar 'magnitude-part magnitude-part-polar) (put 'polar 'angle-part angle-part-polar)こうしておいて,データ(obj)に 対してあるオペレーション(op)を適用したいときの ための手続きoperateを次のように定義します.
(define (operate op obj) (let ((proc (get (type obj) op))) (if (not (null? proc)) (proc (contents obj)) (error "Operator undefined for this type -- OPERATE" (list op obj)))))こうすると,
(define (real-part obj) (operate 'real-part obj)) (define (imag-part obj) (operate 'imag-part obj)) (define (magnitude-part obj) (operate 'magnitude-part obj)) (define (angle-part obj) (operate 'angle-part obj))というように,operateのみを使って4つの汎用手続きを作ることができます. このように,データのタイプをチェックし,適当な手続きを呼び出すという一 般的な方式をタイプに基づくディスパッチング(dispatching on type)と呼び ます. この方式は,なにか大きなシステムを作るときに,拡張性やモジュラリティを 高めるためによく使われる手法です.