Request: Auto string mixin templates
nazriel
spam at dzfl.pl
Tue Jul 30 05:19:05 PDT 2013
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();
}
More information about the Digitalmars-d
mailing list