Reflection: potential possibilities
gareis
dhasenan at gmail.com
Fri Jun 8 05:27:50 PDT 2007
Daniel Keep wrote:
>
> Thomas Kuehne wrote:
>> gareis schrieb am 2007-06-08:
>>> Using TypeInfo, ClassInfo, and such, you can gain a fair bit of
>>> knowledge about a class at runtime.
>>> You could also modify TypeInfo and ClassInfo. Flectioned does this in
>>> allowing you to redirect functions.
>>> You should then be able to create a class at runtime and instantiate it.
>>> The problem, of course, is connecting compile-time code to run-time
>>> classes. This gives two options:
>>> 1. Use CTFE to create classes based on other classes, or just use mixins
>>> and avoid the creation issue entirely.
>>> 2. Use a parent class. Virtual means it just works. (Hopefully.)
>>> I haven't tried these, but it sounds like, if this works, and combined
>>> with function arrays, it should be possible to come up with a program
>>> that writes and then runs itself at runtime. (You need function arrays
>>> to support arbitrary numbers of methods per class.)
>>> The main issues are:
>>> - Does this work at all? Can I create a ClassInfo / TypeInfo object
>>> and then instantiate from it, or do I always need to go from a
>>> preexisting class? Can I actually modify a ClassInfo object and have the
>>> changes reflected in the program? Flectioned seems to indicate so, since
>>> you can redirect functions.
>>> - If it works, how can I link compile-time code to run-time classes?
>>> Any thoughts?
>>> Worst case, for my project, I'll have to use CTFE to parse ClassInfo and
>>> then use mixins to create the classes.
>> If all your class member functions are functions have the signature
>> T functionName(TypeInfo[], void*)
>> and the dynamic classes use a common base class like:
>>
>> # class DynObject : Object{
>> # T call(char[] name, TypeInfo[], void*);
>> # }
>>
>> This can be implemented via Flectioned. The problem is how variadic
>> functions are implemented in D - especially GDC on 64bit systems.
>>
>> Thomas
>
> An alternative might be to use variant arguments; either std.boxer, or
> <plug
> class="shameless">http://www.prowiki.org/wiki4d/wiki.cgi?DanielKeep/Variant</plug>.
>
> I'd say more, but I'm not entirely sure what you're trying to do...
>
> -- Daniel
Basically a version of this: http://www.ayende.com/projects/rhino-mocks.aspx
It'll be mainly for my own code, which doesn't use varargs, but if I do
anything useful with it, I'll release it.
It sounds like it'll take maybe a week to set up the core of it. D is
fast :) As well as Thomas Kuehne doing all the work before I got here.
Thank you for that.
More information about the Digitalmars-d-learn
mailing list