Time for std.reflection

Max Samukha maxsamukha at gmail.com
Sun Jul 22 08:10:45 PDT 2012


On Saturday, 21 July 2012 at 21:44:52 UTC, Andrei Alexandrescu 
wrote:

>
> Please chime in with thoughts. Would someone want to pioneer 
> this project?
>

There are some questions.

1. static info = getModuleInfo("std.algorithm");

The language does not allow you to use CTFE parameter values as 
arguments to __traits/templates. Therefore, to be able to build 
meta-objects at compile-time, you would have to:

static info = getModuleInfo!"std.algorithm";

2. Then, what is the preferred way of referencing compiler 
objects - with strings or directly:

import std.algorithm;
static info = getModuleInfo!(std.algorithm);
?

I think using strings while we have direct access to those 
objects is not an incredibly good idea. Those strings will be 
mixed-in by getXxxInfo anyway:

ModuleInfo getModuleInfo(string name)()
{
     ...
     mixin("import " ~ name ~ ";");
     mixin("alias __traits(getMembers, " ~ name ~ ") members;");
     foreach (m; members)
     ...
}

3. auto info = getModuleInfo("std.algorithm");

There is no way to mutate global data structures at compile-time, 
therefore you would have to build, at run time, a data structure 
aggregating all meta-objects coming from various modules.

That could be achieved with static constructors:

module std.reflection;

// application-wide module info registry
private ModuleInfo[string] moduleInfos;

// run-time module info getter
string getModuleInfo(string s)
{
     return moduleInfos[s];
}

string makeModuleInfoAvailableDynamically()
{
     return q{
         shared static this() { shared static mi = 
getModuleInfo!(__traits(thisModule));
             moduleInfos[mi.name] = mi; }
     };
}

Problematic because mixing-in makeModuleInfoAvailableDynamically 
would mean that circular imports are no longer allowed for that 
module. Remember the whining babies complaining about this very 
use case a while ago?

What about changing the language so that static constructors 
marked with @system are exempted from circular dependency 
checking?

3. If you are against inheritance, why classes and not structs?

4. How the whole thing is intended to interact with dynamic link 
libraries?






More information about the Digitalmars-d mailing list