09/04/09 11:23:31
>>92
ありがとうございます。ですが、メッセージ名を気をつけても、現実としてメッセージ名の
衝突は起こると思います。
たとえばC++で申し訳ないんですが、
class Foo
{
virtual void update() = 0;
};
class Bar
{
virtual void update(bool flag) = 0;
};
があるとすると、メッセージ名がupdateと同じでもメッセージのプロトコルが違います。
C++なら単一ディスパッチなので、メッセージ送信先とメッセージ名で呼ぶべきメッセー
ジのプロトコルが定まります。
ですが同じことをCommon Lispでしようとしたら、パッケージにくるんで、呼び出し元で
(foo:update foo-instance)
(bar:update bar-instance t)
とする方法か、もしくは総称関数を
(defgeneric update (o &rest rest))
と定義するくらいしか思いつきません。前者はどうみても冗長ですし、後者はCommon Lisp
の引数チェック機構が死にます。
根本的に勘違いしてる可能性もありますが、うまい方法はないでしょうか。