On Tuesday, 14 July 2015 at 01:05:21 UTC, jmh530 wrote:
Note: some of the above seemed to only work when I kept the std.math.cos, std.math.sin text in there. When I take it out, I get warnings about recursive aliases.

Yeah, you can't do `alias cos = givemeabettername!cos;`. That would define the new cos in terms of itself.

But, I can't seem to use a foreach loop. The recursive mixin template seems to be required.

You can only use the implicitly static foreach where the normal, dynamic foreach is allowed, i.e. in function bodies. This is a syntactic restriction. If we had `static foreach` (like we have `static if`), that would presumably work everywhere.


So this is the last thing I did (that didn't work). Adding foo back to the alias works.

mixin template callThemAll(functions...)
{
   mixin("alias " ~__traits(identifier, functions[0]) ~
" = givemeabettername!(std.math."~__traits(identifier, functions[0]) ~ ");");
    static if(functions.length >1)
                mixin callThemAll!(functions[1..$]);
}

mixin callThemAll!(cos, sin);

Works for me. Please show the complete code and the error message you get.

Here's what works for me:
----
import std.algorithm: map;
import std.math;
import std.array: array;

template givemeabettername(alias fun)
{
    T givemeabettername(T : U[], U)(T x)
    {
        return x.map!fun.array;
    }
}

mixin template callThemAll(functions...)
{
    mixin("alias " ~__traits(identifier, functions[0]) ~
" = givemeabettername!(std.math."~__traits(identifier, functions[0]) ~ ");");
    static if(functions.length >1)
        mixin callThemAll!(functions[1..$]);
}

mixin callThemAll!(cos, sin);

void main()
{
    real[] a = [1, 2, 3];
    auto c = cos(a);
    auto s = sin(a);
}
----

Reply via email to