On Friday, 26 July 2019 at 14:56:37 UTC, Andrey Zherikov wrote:

Even without static if I get the same result:
mixin template my_import(alias modName)
{
    mixin("import " ~ modName ~ ";");
}
mixin my_import!"mymod";
pragma(msg,fullyQualifiedName!(myfunc)); // Error: undefined identifier myfunc
pragma(msg,fullyQualifiedName!(mymod.myfunc)); // mymod.myfunc

If I understood template mixin doc correctly this happens because of "The declarations in a mixin are placed in a nested scope". So is there a way to make two use cases above to work the same way, i.e. "myfunc" to be available without "mymod." prefix?

Exactly. Because of scoping rules mixin templates are nearly useless, there was a lot of frustration/criticism on them, but this is by design - to not turn them in macro hell like in C. My opinion is that if core team are so picky about explicitness they should also provide a way to explicitly mix into the current scope, but of course I'm just yet another stranger here.

So you can do string mixin instead, however it requires more labor, and usually one has to keep in mind all intricacies of the features used which quickly leads to complexity combinatory explosion.

But whatever... With helper function above you can try this

    @property string my_import(alias mod)()
    {
        return
"static if (__traits(compiles, isModuleAvailable!\"" ~ mod ~ "\"))" ~
        "{" ~
        " mixin(\"import \",\"" ~ mod ~ "\", \";\"); " ~
        "}";
    }

    // should import into current scope
    mixin(my_import!"std.string");

Reply via email to