Используя динамическую типизацию в D, статически типизированном языке

Я реализовал библиотеку динамической типизации для 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 , что приводит к сбою моей программы.

Я не могу. придумайте способ исправить это. У кого-нибудь есть идея?

8
задан Mehrdad 18 August 2011 в 05:08
поделиться