Mixin operator 'if' directly
H. S. Teoh
hsteoh at quickfur.ath.cx
Thu Dec 20 16:23:39 UTC 2018
On Thu, Dec 20, 2018 at 11:04:19AM +0000, bauss via Digitalmars-d-learn wrote:
> On Wednesday, 19 December 2018 at 15:40:50 UTC, Neia Neutuladh wrote:
[...]
> > mixin template foo()
> > {
> > int _ignoreme()
> > {
> > if (readln.strip == "abort") throw new AbortException;
> > return 1;
> > }
> > int _alsoIgnoreMe = _ignoreme();
> > }
> > void main()
> > {
> > mixin foo;
> > }
>
> That's a genius hack.
>
> I have to adapt this!
Me too! This is awesome! This basically lets you insert arbitrary code
via mixin templates with essentially no restrictions! You can even
reuse the same ignore-identifiers in multiple instantiations of the same
template, e.g.:
import std.stdio;
mixin template CodeMixin(int i)
{
int _impl()
{
static if (i == 0)
{
writeln("Haha, we inserted code via declarations!");
return int.init;
}
else static if (i == 1)
{
writeln("Well whaddya know, we can do multiple mixins!");
return int.init;
}
else static assert(0);
}
int _impl2 = _impl();
}
void main()
{
writeln("Does it respect order?");
mixin CodeMixin!0;
writeln("I should think so! But you never know...");
mixin CodeMixin!1;
writeln("Wow, can we really do multiple mixins of this sort?");
}
The output is:
Does it respect order?
Haha, we inserted code via declarations!
I should think so! But you never know...
Well whaddya know, we can do multiple mixins!
Wow, can we really do multiple mixins of this sort?
T
--
If I were two-faced, would I be wearing this one? -- Abraham Lincoln
More information about the Digitalmars-d-learn
mailing list