can I reuse statements?

Paul Backus snarwin at gmail.com
Mon May 10 21:10:13 UTC 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:
>
> ```d
>             switch(code) {
>                 case X, Y: // that specific case repeats alot 
> in the code in different procedures
>                   mixin handleXY;
>
>                 default:
>          }
> ```
>
> then
>
> ```d
> 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:

```d
// 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:

```d
case X, Y:
     mixin(handleXY);
```


More information about the Digitalmars-d-learn mailing list