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