Stavo implementando una libreria di digitazione dinamica per D quando ho riscontrato un problema interessante.Utilizzo della digitazione dinamica in D, un linguaggio tipizzato staticamente
Al momento, sono riuscito a creare una funzione denominata dynamic()
che restituisce una versione dinamica di un oggetto.
Ad esempio:
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
}
Il problema che ho incontrato in tutto è il fatto che writeln
cercherà di utilizzare fase di compilazione riflessione per capire come trattare result
.
Qual è la prima cosa che prova? isInputRange!(typeof(result))
Il problema è che restituisce true! Perché? Perché devo supporre che tutti i membri di cui ha bisogno esistano, a meno che non possa dimostrare il contrario in fase di esecuzione - che è troppo tardi. Quindi il programma tenta di chiamare front
, popFront
e empty
su result
, arrestando in modo anomalo il mio programma.
Non riesco a pensare a un modo per risolvere questo problema. Qualcuno ha un'idea?
'std.variant' non supporta i tipi che hanno campi arbitrari. –
@cyber cosa intendi? –
OP vuole creare un oggetto dove 'obj.anything' è valido in fase di compilazione (anche se potrebbe non essere valido in fase di esecuzione). Nulla in 'std.variant 'permette questo, come ho visto. –