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