Thread overview
can I reuse statements?
May 10, 2021
Jack
May 10, 2021
Paul Backus
May 11, 2021
Jack
May 10, 2021

mixin template seems to allow only declarations so if I put a if or case-statement in the body it doesn't work. I'd like to make something like this work:

            switch(code) {
                case X, Y: // that specific case repeats alot in the code in different procedures
                  mixin handleXY;

                default:
         }

then

mixin template foo()
{
                auto c = arr[i]; // arr and i are available at switch(code)'s scope
                auto m = Message(...);

                switch(code)
                {
                    case BAA_A:  c.doSomething(m); break;
                    case BAA_B: c.doSomething(m); break;
                    default: assert(0, "error");
                }
}
May 10, 2021

On Monday, 10 May 2021 at 21:01:53 UTC, Jack wrote:

>

mixin template seems to allow only declarations so if I put a if or case-statement in the body it doesn't work. I'd like to make something like this work:

            switch(code) {
                case X, Y: // that specific case repeats alot in the code in different procedures
                  mixin handleXY;

                default:
         }

then

mixin template foo()
{
                auto c = arr[i]; // arr and i are available at switch(code)'s scope
                auto m = Message(...);

                switch(code)
                {
                    case BAA_A:  c.doSomething(m); break;
                    case BAA_B: c.doSomething(m); break;
                    default: assert(0, "error");
                }
}

You can do it with a string mixin:

// Note: q{ ... } creates a "token string", a special kind of string literal
// that's used for code strings.
// See https://dlang.org/spec/lex.html#token_strings
enum string handleXY = q{
                auto c = arr[i]; // arr and i are available at switch(code)'s scope
                auto m = Message(...);

                switch(code)
                {
                    case BAA_A:  c.doSomething(m); break;
                    case BAA_B: c.doSomething(m); break;
                    default: assert(0, "error");
                }
};

Usage:

case X, Y:
    mixin(handleXY);
May 11, 2021

On Monday, 10 May 2021 at 21:10:13 UTC, Paul Backus wrote:

>

On Monday, 10 May 2021 at 21:01:53 UTC, Jack wrote:

>

[...]

You can do it with a string mixin:

// Note: q{ ... } creates a "token string", a special kind of string literal
// that's used for code strings.
// See https://dlang.org/spec/lex.html#token_strings
enum string handleXY = q{
                auto c = arr[i]; // arr and i are available at switch(code)'s scope
                auto m = Message(...);

                switch(code)
                {
                    case BAA_A:  c.doSomething(m); break;
                    case BAA_B: c.doSomething(m); break;
                    default: assert(0, "error");
                }
};

Usage:

case X, Y:
    mixin(handleXY);

sounds good, thanks!