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 には各パケジで登録を行なう必要あり

へろへろなんで実装は別途。