Note that one library that did attempt runtime reflection capability
(flectioned) does all this at runtime, and does some really funky shit,
like opening /proc/self/map on Linux, or requiring you to pass an
OPTLINK map file. I don't look at these as "innovations" as much as I do
as workarounds.

Maybe there's a better approach than flectioned. Consider the language is frozen solid. How would you solve problems with it?

I think the closest anyone has come is Jacob, with his orange library. Maybe he can respond to this point.

-Steve

Just showing this because it never comes up that one can already implement
runtime reflection using ModuleInfo.xgetMembers and TypeInfo_Struct.xgetMembers.

module a;
import std.stdio, std.variant;

void main()
{
    foreach(m; ModuleInfo)
    {
        if (m.name != "b") continue;
        // getMembers currently doesn't work for classes,
        // but it does for modules/structs
        auto get = cast(Variant function(string))m.xgetMembers;
        auto bfunc = get("bfunc").get!(size_t function());
        writeln(bfunc());
    }
}


module b;
import std.variant;

// a pointer to this method will end up in ModuleInfo xgetMembers
Variant getMembers(string name)
{
    Variant res;
    switch (name)
    {
    case "bfunc": return Variant(&bfunc);
    default: return Variant("member "~name~" not found");
    }
}

size_t bfunc()
{
    return 2;
}

It should be fairly easy to construct some helpers that make the compile time data digestible.

Reply via email to