Я реализовал библиотеку динамической типизации для 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
пытается использовать отражение времени компиляции , чтобы выяснить, как обрабатывать результат
.
Что он пробует в первую очередь? isInputRange! (Typeof (result))
Проблема в том, что он возвращает true ! Почему? Потому что я должен предположить, что все элементы, которые ему нужны, существуют, если я не смогу доказать обратное во время выполнения - что уже слишком поздно. Таким образом, программа пытается вызвать front
, popFront
и empty
в result
, что приводит к сбою моей программы.
Я не могу. придумайте способ исправить это. У кого-нибудь есть идея?