Recursive mixins problem

JScott jnl417 at gmail.com
Thu Apr 12 05:56:16 PDT 2007


Max Samukha Wrote:

> Why recursive mixins are disallowed?
> 
> template Call(A...)
> {
>     static if (A.length > 0)
>     {
>         void call(A[0] fn)
>         {
>         }
> 
>         mixin Call!(A[1..$]);
>     }
> }
> 
> class Caller(A...)
> {
>     mixin Call!(A);
> }
> 
> void main()
> {
>     auto caller = new Caller!(int delegate(), char[] delegate());
> }
> 
> hello.d(15): mixin hello.Caller!(int delegate(),char[]
> delegate()).Caller.Call!(int delegate(),char[]
> delegate()).Call!(char[] delegate()).Call!() recursive mixin
> instantiation
> hello.d(26): template instance hello.Caller!(int delegate(),char[]
> delegate()) error instantiating
> 
> 

I would assume that this is not allowed because of the way mixin templates work. Everytime you instanciate a template as a mixin a new scope is created so it's possible to create a symbol with too long of a name.

Now that there are mixins and compile-time execution of functions it's possible to do what you want.

template Call(A...) {
    static if(A.length == 0)
        const char[] Call = "";
    else static if(A.length == 1 )
        const char[] Call = "void call("~(typeof(A[0])).stringof~" fn) { \n \n }";
    else
        const char[] Call = "void call("~(typeof(A[0])).stringof~" fn) { \n \n } \n" ~ Call!(A[1..$]);
}

class Caller(A...) {
    mixin(Call!(A));
}


More information about the Digitalmars-d-learn mailing list