Can someone explain me why in the following code the alias parameter expands differently for first and second Instantiation?

module main;
import std.stdio;
import std.conv;

struct Cascade {
    this(int a, immutable(Cascade)[] b)
    {
        f1 = a;
        f2 = b;
    }
    this(int a)
    {
        f1 = a;
        f2 = null;
    }
    int f1;
    immutable(Cascade)[] f2;
}

immutable Cascade [] array1 = [
    Cascade(1),
    Cascade(2),
    Cascade(3),
    Cascade(3)
];

mixin template StaticArr(alias a) {
    immutable(typeof(a[0]))[a.length] array = a;
    string repr = a.stringof;
    void printIt()
    {
        writeln(repr);
    }
}

int main()
{
    mixin StaticArr!(array1) x;
    mixin StaticArr!([
        Cascade(10),
        Cascade(20, array1)]) y;

    x.printIt();
    y.printIt();

    return 0;
}

Running the program prints:
array1
[Cascade(10, null), Cascade(20, [Cascade(1, null), Cascade(2, null), Cascade(3,
null), Cascade(3, null)])]

I can understand that array1 is not expanded to its value representation in the first call, but why is then when passed as an argument to the Constructor of the literal argument in the second call? Am I missing something obvious?

Thanks,
Jorge

Reply via email to