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