On Thursday, 20 December 2018 at 16:23:39 UTC, H. S. Teoh wrote:
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
Note that it even captures locals:
import std.stdio, std.conv;
mixin template CodeMixin(int i)
{
int _impl()
{
static if (i == 0)
{
writeln("Haha, we inserted code via declarations! - " ~
to!string(x));
return int.init;
}
else static if (i == 1)
{
writeln("Well whaddya know, we can do multiple mixins! - "
~ to!string(x));
return int.init;
}
else static assert(0);
}
int _impl2 = _impl();
}
void main()
{
int x = 3;
writeln("Does it respect order?");
mixin CodeMixin!0;
writeln("I should think so! But you never know...");
x = 4;
mixin CodeMixin!1;
writeln("Wow, can we really do multiple mixins of this sort?");
getchar();
}
Seems like it could be used to replace a lot of string mixins so
that real debugging could take place along with CT error
checking, etc.