Estaba implementando una biblioteca de tipado dinámico para D cuando me encontré con un problema interesante.Usando el tipado dinámico en D, un lenguaje estáticamente tipado
En este momento, he logrado crear una función llamada dynamic()
que devuelve una versión dinámica de un objeto.
Por ejemplo:
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
}
El problema que he encontrado a través de es el hecho de que writeln
intenta utilizar tiempo de compilación reflexión para encontrar la manera de tratar result
.
¿Qué es lo primero que intenta? isInputRange!(typeof(result))
El problema es que devuelve verdadero! ¿Por qué? Porque tengo que suponer que todos los miembros que necesita existen, a menos que pueda demostrar lo contrario en tiempo de ejecución, lo cual es demasiado tarde. Entonces el programa intenta llamar al front
, popFront
y empty
en result
, bloqueando mi programa.
No se me ocurre una manera de arreglar esto. ¿Alguien tiene alguna idea?
'std.variant' no es compatible con tipos que tienen campos arbitrarios. –
@cyber, ¿qué quieres decir? –
OP quiere crear un objeto donde 'obj.anything' sea válido en tiempo de compilación (aunque puede que no sea válido en tiempo de ejecución). Nada en 'std.variant' permite esto, como he visto. –