SICPゼミ第35回

練習問題2.82

例えば引数が長方形と菱形と正方形であるときを考えると、全ての引数を平行四辺形に強制型変換しなければならないが、各引数の型へと変換しようとする限り、平行四辺形にはたどり着かない。つまり、型の関係において分岐が生じており、その分岐の葉にあたる型のみが引数として与えられたときにうまく動かないと考えられる。
by tube

練習問題2.83
(define (integer->rational n)
  (make-rational (contents n) 1))

(define (rational->scheme-number n)
  (let ((nu (car (contents n)))
        (de (cdr (contents n))))
    (make-scheme-number (/ nu de))))

(define (scheme-number->complex n)
  (make-complex-from-real-imag (contents n) 0))

ジェネリックなraiseは適当にputして適当にgetすればいい。

練習問題2.84

一つ目の型をraiseを使ってあげていく。二つ目の型と一致したらOK。一致するまえに一番上に行く(raiseがエラーを返す)ときは、二つ目の型をあげていく。

練習問題2.85

一度projectをしてからraiseをして、元の値と比較することで、情報落ちがないかを確認するというdropの手続きを実装せよという問題だが、端的に言ってこの問題で要求されている処理には無駄が大きいと言わざるを得ない。
projectの実装は当然project前後の型に依存しており、projectの動作を記述する際に、projectによって情報落ちが発生するかの判定を組み込むことは容易に可能である。
これにも関わらず、projectの段階で情報落ちの判定をせずに、dropの処理の段階に情報落ちの判定を分割することは明らかに無駄であり、不要な処理を記述することになってしまう。
以上より、dropの実装は省略する。

練習問題2.86

複素数パッケージの内部手続きの演算(+とか*とか)をジェネリック演算にする。
sine、cosineは実数に型変換してつっこむ。