Request: Auto string mixin templates

JS js.mdnq at gmail.com
Tue Jul 30 05:25:45 PDT 2013


On Tuesday, 30 July 2013 at 12:19:06 UTC, nazriel wrote:
> On Monday, 29 July 2013 at 10:54:37 UTC, JS wrote:
>>
>> I have a template t that returns a string that is always to be 
>> used as a mixin.
>>
>> It is quite annoying to have to use mixin() on the template.
>>
>> e.g.,
>>
>> mixin(t!());
>>
>> It would be nice to be able to specify that the template is 
>> mixed in at the call site.
>>
>> e.g.,
>>
>> string mixin template t() { ... }
>>
>>
>> then
>>
>> t!(); // is equivalent to mixin(t!()); and no scope issues
>>
>> The post at
>>
>> http://forum.dlang.org/thread/wqmngajgejxreyzftrdw@forum.dlang.org#post-wqmngajgejxreyzftrdw:40forum.dlang.org
>>
>> Has an example case where I have to call mixin(tJoin!(...)) to 
>> generate the code to join the strings. This statement can't be 
>> wrapped in way to simplify it without defeating the purpose of 
>> the optimization it gives.
>>
>> The problem is that when you use variables in a string mixin 
>> that are outside the template definition and try to string 
>> mixin(to hide the explicit mixin call), then those variables 
>> are outside the scope making the call fail.
>>
>>
>> In the code above, tJoin takes a variadic set of arguments and 
>> forms a string that concatenates all of them(just as if you 
>> typed it by hand) but also deals with string arrays by 
>> inserting a call to a RT function that joins the array.
>>
>> so the output of tJoin is a code string that can be used to 
>> concatenate all the arguments passed to it... e.g.,
>>
>> tJoin!(":", a, b, "c") ==> `a~b~"c"`; if a and b are strings.
>>
>> mixing in that string, e.g., mixin(tJoin!(":", a, b, "c")), 
>> will concatenate a with b with c... but only if in the scope 
>> of a and b. Hence, trying to wrap the mixin statement will 
>> change it's scope and a and b will either be unknown or wrong.
>>
>> Having someway to specify that the template should 
>> automatically be mixed in would help solve these sorts of 
>> problems(I've ran across it before when trying to generate 
>> code using a template and avoid the mixin statement).
>>
>> A few possible options are:
>>
>> string mixin template t() { ... }
>>
>> string template t() { ... }
>>
>> auto mixin template t() { ... }
>>
>> template t() { ... mixin enum t = ...; }
>>
>> template t() { ... mixin t = ...; }
>>
>> etc...
>
>
> You already have mixin templates.
>
> Eg:
>
> http://dpaste.dzfl.pl/e4b2e17a
>
> import core.stdc.stdio;
>
> mixin template Test()
> {
> 	class Meh
> 	{
> 		this()
> 		{
> 			printf("In Meh");
> 		}
> 	}
> }
>
> void main()
> {	
>     mixin Test;
> 	
>     Meh m = new Meh();
> }

First how does that remove having to type mixin every time?

Second, Mixins are not the same as string mixins.



More information about the Digitalmars-d mailing list