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