SICP 読み (65) 2.5.2 異る型のデータの統合

ちょっと時間が空いてしまいましたが、問題 2.82 を机上ベースで検討。
この問題、英語版のものも見たのですが、どっちも意味が分かりにくかった (ってか、英語の方はデフォルト分かんね、なんですが)。特に以下の部分。

この戦略が (そして上の二引数版が) 十分に一般的でない状況の例をあげよ。(ヒント:表の中に試みられない何か適当な混合型の演算がある場合を考えよ。)

例えばヒントにある混合型の演算というのは p.114 にあるような complex と scheme-number の add になるだろう、と。
で、誤解していたのは_この戦略_と_上の二引数版_を同列で考えないとイケナイの??という事。_この戦略_は一般化した解の一つだし、_上の二引数版_は逆に特殊な例。このあたりで頭が混乱していた。


で、この一般化のための実装ですが、例えば二つのリストを用意しといて、一つは空なリスト、もう一つは args という形にしておきます。

(let ((a '()) (b args)))
;; args が '(c s r s r) とすると
;; a が '() で b が '(c s r s r) になる

(c は complex で s は scheme-number で r は rational の略です)


次に (car b) の型に a と (cdr b) の各要素を強制型変換して成功すれば get で取り出した手続きに適用させれば良い。逆に失敗した場合には a に (car b) を append して、b には (cdr b) のみという形にして同様の手続きを適用。
という事は先に各要素を強制型変換して手続きを表から取り出す形になるので、表に登録されているべき手続きは同一型の演算のみで良い事になる。
例えば complex 同士の add であれば以下のような形で表に put すれば良い??

(put 'add 'complex (lambda (z1 . z2) (tag (add-complex z1 z2))))

(なんか微妙そげ)

こうした戦略においての特殊な状況というと、上記の p.114 の complex と scheme-number の add 演算が表に登録されていたとしても、それは get されない、という事だという事なんだろうか。逆に p.115 の apply-generic 手続きは一般的ではないからこそ、こうした演算が用意されていれば適用してしまう、という事で良いのかなぁ。

実装は余裕ぶっこいてるトキに別途、とさせて下さひ (弱

追記

なんか違う気が。でも一旦全部を同じ型に、というのが特殊じゃねぇか、という指摘だとすると上の解でもセイフなんだろうか。難しいなぁ。