09/04/09 23:25:38
>>95
>問題にしてるのは
>・メッセージ名が同じ
>・プロトコルが異なる
C++のオーバーロードのおかげで「同じメッセージ」のように見えるが、実態としてメッセージとしてもプロトコルとしても同じではないものな希ガス。
というか、あえて言うならメンバ関数名とシグネチャあわせてひとつのメッセージ名でないの?
function update(target, flg) {
target[arguments.callee.name+'With'+flg.constructor.name].apply(null, arguments);
}
function updateWithBoolean(target, flg) { // update(obj, true)相当
/* ほげほげ */
}
function updateWithNull(target) { // update(obj)相当
/* ふがふが */
}
↑こういう付加情報からのメッセージ名推測(?)みたいな動的なことをC++,Java他はコンパイル時に暗黙のうちにやっているというだけでないのかな。
>この二つを満たすメッセージを定義する上手い方法が総称関数には無いのではないか、という点です。
>単一ディスパッチの言語にはあるにもかかわらず、です。
異なるメッセージをプレフィクスに基づいて同じメッセージのように推測するという「特別扱い=オーバーロード」があるかないかというだけで、
単一ディスパッチ/多重ディスパッチの問題じゃないんじゃないかと思うぞ。Objective-Cなんかこういうことしてくれないでしょ。単一ディスパッチ”なのにもかかわらず”。
>もし統一的に表すために新たに総称関数を新たに定義した場合、その総称関数をどこに配置
>するかという事も新たに考えねばなりませんし、機械でできそうな処理を人間が書く必要が
>あるという点でLisp的ではない気がします。
そこでLisp的にはマクロの出番なんでないかな。
※Lisp系のスレでJavascriptで答えてしまってすまないorz