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

Reply via email to