理系学生日記

おまえはいつまで学生気分なのか

問題2-81a (2.5.2 Combining Data of Different Types)

どういう内容だったか忘れてしまうので、エントリにメモのこしていく事にしたのでした。


今まで無視ってきたこととして、複素数と普通の数の足し算とか、そういう混ぜ合わさった計算ができない感じです。
もちろん、引数として明示的に複素数と自然数を取る関数を作れば解決、やった!とかそういう話なんですけど、それだとその組み合わせが爆発する。
こういうときには普通の数を複素数とみてやればいいんだ!!coercionだ!
これで複素数と自然数の計算が複素数と複素数の計算とかに帰着できます。やりましたね!


でもでも、有理数と自然数の計算が定義されてなくて複素数と複素数の計算は定義されてたりしたら、有理数->複素数、自然数->複素数ていうcoercionがあればいいんだけど、じゃぁそういう変換規則ってどうするのっていう。
そこで階層構造の登場ですよ!階層とかOOだけじゃないのね。
たくさん親もったりすると大変ですけど、それはSICPの範囲じゃないそうです。


で問題。
SICPで問題ばっかし引き起こすLouis Reasonerというトラブルメーカーがいるんですけど、こんなcoercionを作り始めた。ある型から同じ型へのcoercion。

(define (scheme-number->scheme-number n) n)
(define (complex->complex z) z)
(put-coercion 'scheme-number 'scheme-number
              scheme-number->scheme-number)
(put-coercion 'complex 'complex complex->complex)

何が起こるって、apply-genericが無限ループするだろ常考。