Need runtime reflection?

Paulo Pinto pjmlp at progtools.org
Tue Jul 17 23:49:11 PDT 2012


On Tuesday, 17 July 2012 at 15:08:18 UTC, David Piepgrass wrote:
>> I want to imitate golang's interface in D, to study D's 
>> template. I wrote
>> some code: https://gist.github.com/3123593
>>
>> Now we can write code like golang:
>> --
>> interface IFoo {
>>    void foo(int a, string b, float c);
>> }
>>
>> struct Foo {
>>    void foo(int a, string b, float c) {
>>        writeln("Foo.foo: ", a, ", ", b, ", ", c);
>>    }
>> }
>>
>> struct FooFoo {
>>    void foo(int a, string b, float c) {
>>        writeln("FooFoo.foo: ", a, ", ", b, ", ", c);
>>    }
>> }
>>
>> GoInterface!(IFoo) f = new Foo;
>> f.foo(3, "abc", 2.2);
>>
>> f = new FooFoo;
>> f.foo(5, "def", 7.7);
>> --
>>
>> It is also very naive, does not support some features, like 
>> out/ref
>> parameters, free functions *[1]* and so on. The biggest 
>> problem is downcast
>> not supported. In golang, we can write code like*[2]*:
>> --
>> var p IWriter = NewB(10)
>> p2, ok := p.(IReadWriter)
>> --
>>
>> Seems [p.(IReadWriter)] dynamically build a virtual table 
>> *[3]*,because the
>> type of "p" is IWriter, it is *smaller* than IReadWriter, the 
>> cast
>> operation must search methods and build vtbl at run time.
>>
>> In D, GoInterface(T).opAssign!(V)(V v) can build a rich 
>> runtime information
>> to *V* if we need. But if *V* is interface or base class, the 
>> type
>> information not complete. So, seems like I need runtime 
>> reflection? and how
>> can I do this in D? I did not find any useful information in 
>> the TypeInfo*.
>>
>> ------
>> [1] free functions support, e.g.
>> --
>> interface IFoo {
>>    void foo(int a, string b, float c);
>> }
>> void foo(int self, int a, string b, float c) {
>>    writefln("...");
>> }
>>
>> GoInterface!(int) p = 1;
>> p.foo(4, "ccc", 6.6);
>> --
>> In theory no problem.
>
> I, too, was enamored with Go Interfaces and implemented them 
> for .NET:
>
> http://www.codeproject.com/Articles/87991/Dynamic-interfaces-in-any-NET-language
>

Interesting article, but why not just make use of "dynamic" 
interfaces?

--
Paulo


More information about the Digitalmars-d mailing list