興味深い問題に遭遇したとき、私は D の動的型付けライブラリを実装していました。
現在、dynamic()
オブジェクトの動的バージョンを返す関数の作成に成功しています。
例えば:
import std.stdio, std.dynamic.core;
class Foo
{
string bar(string a) { return a ~ "OMG"; }
int opUnary(string s)() if (s == "-") { return 0; }
}
void main(string[] argv)
{
Dynamic d = dynamic(new Foo());
Dynamic result = d.bar("hi");
writeln(result); // Uh-oh
}
私が遭遇した問題は、コンパイル時のリフレクションをwriteln
使用して を処理する方法を見つけようとするという事実です。result
それが最初に試みることは何ですか? isInputRange!(typeof(result))
問題は、それがtrueを返すことです! なんで?実行時にそうでないことを証明できない限り、必要なすべてのメンバーが存在すると想定する必要があるためです。これでは遅すぎます。front
そのため、プログラムは、popFront
、およびempty
onを呼び出そうとresult
し、プログラムをクラッシュさせます。
これを修正する方法が思いつきません。誰にもアイデアはありますか?