Recursive mixins problem

Max Samukha samukha at voliacable.com
Mon Apr 16 06:39:51 PDT 2007


On Thu, 12 Apr 2007 08:56:16 -0400, JScott <jnl417 at gmail.com> wrote:

>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));
>}

Thanks. I know about the new mixins, but the bodies of functions being
mixed in are big in my case and the whole thing quickly turns into an
unreadable mess when the new mixins are used.


More information about the Digitalmars-d-learn mailing list