SICP 読み (67) 2.5.2 異る型のデータの統合
問題 2.84 の検討メモを晒してみる。
とりあえず、問題 2.83 な apply-generic は以下。
(define (apply-generic op . args) (let ((type-tags (map type-tag args))) (let ((proc (get op type-tags))) (if proc (apply proc (map contents args)) (error "No method for these types -- APPLY-GENERIC" (list op type-tags))))))
これと raise をどう merge すれば良い??
- 型の塔 (tower of types) をどう実装する??
- どっちが上かが分からないと駄目 → 汎用性を損なわない工夫が必要
- レベルを合わせる繰り返しが必要??
- 手続きとして分けた方が良さげ。
- raise という手続きは apply-generic しない方向?? (違
- tower of types の実装方法
- 表を作る、という方針で
type | upper | lower |
---|---|---|
complex | - | real |
real | complex | rational |
rational | real | integer |
integer | rational | - |
「二つ」を前提にしてみる? 一般化可能な解を検討?
→どっちが高いか、ではなく一番高いのどれか、という形?
二つ以上、だったら
- 最初に二つのどちらが higher かを判断して
- それと後続のを比較、で良い?
判断の方法としては、二つの内の一方が
- (get type 'upper) が失敗 → highest (てっぺん) → こちらの方が高い
- (get type 'lower) が失敗 → lowest (最下層) → こちらの方が低い
- レベルを上げてもう一方と同じになるかを試験
- 型が合わずにてっぺんまで行った → こちらの方が高い
- 型が合った → こちらの方が低い
- これで判断可能なはずなんであとは raise でレベルを合わせれば良い
- tower of types には各パケジで登録を行なう必要あり
へろへろなんで実装は別途。