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