Template mixins - why only declarations

Gary Willoughby dev at nomad.so
Fri Mar 7 08:52:21 PST 2014


On Thursday, 6 March 2014 at 18:31:02 UTC, Frustrated wrote:
> On Thursday, 6 March 2014 at 17:27:35 UTC, Steve Teale wrote:
>> Pretty much what the subject says. Why can't template mixins 
>> include statements ans so on?
>>
>> Is it just too hard, or is it just too much like C macros?
>>
>> Steve
>
> template mixins mix in directly into the code as if you typed 
> them. If they contained statements then you could mixin 
> statements into classes, say, and it would then be illegal.
>
> I guess there is no reason per se, but I guess that wasn't the 
> desired behavior for template mixins. I imagine there could be 
> a definite downside to having template mixins containing 
> statements. Also, they can't be self contained.
>
> e.g.,
>
> mixin template C()
> {
>    i = i + 1;  // invalid
> }
>
> ...
>
> int i = 0;
> mixin C();
>
>
> The template itself can't be semantically checked in place 
> because i is unknown inside the template. (it is not self 
> contained so to speak)
>
> In any case, just seems wrong for templates to do that. They 
> are not grouping expressions but grouping definitions and 
> declarations of things so you don't have to do them multiple 
> times.
>
> string mixins, OTOH, could do the above.
>
> template C()
> {
>     string C()
>     {
>         return "i = i + 1;";
>     }
> }
>
> ...
>
> int i = 0;
> mixin(C);
>
> and this will work. This is because the statement is contained 
> within a string and the compiler simply inserts the string 
> directly. The template can still be validated in place(since "i 
> = i + 1" is a string and has no other meaning in the template).

Interesting. I regularly use template mixins referring to 'this' 
and they work fine. e.g.:

mixin template Bar()
{
     public int getFoo()
     {
         return this.foo;
     }
}

class Foo
{
     private int foo;
     mixin Bar;
}



More information about the Digitalmars-d-learn mailing list