On Monday, 8 June 2020 at 10:23:24 UTC, jmh530 wrote:
On Monday, 8 June 2020 at 04:13:08 UTC, Mike Parker wrote:
[snip]


The problem isn't the mixin. It's the template. Templates take the scope of their declaration, not their instantiation. So the mixin is getting the template's scope.

Anyway, this appears to work:

`double z = foo!"std.math.fabs"(x);`

Thanks, that makes sense.

However, I get the same error with the code below. Am I doing something wrong?

double foo(alias f)(double x) {
    return f(x);
}

template foo(string f)
{
    mixin("alias foo = .foo!(" ~ f ~ ");");
}

void main() {
    static import std.math;
    double x = 2.0;
    double y = foo!(std.math.fabs)(x);
    double z = foo!"std.math.fabs"(x);
}

If you want to refer to symbols in the scope where the template is instantiated, you will have to move the mixin outside of the template:

double foo(alias f)(double x) {
    return f(x);
}

template foo(string f)
{
    enum foo = "foo!(" ~ f ~ ")";
}

void main() {
    import std.math: fabs;
    double x = 2.0;
    double y = foo!(fabs)(x);
    double z = mixin(foo!"fabs")(x);
}

Reply via email to