how to achieve C's Token Pasting (##) Operator to generate variable name in D?

Paul Backus snarwin at gmail.com
Sat May 30 22:21:14 UTC 2020


On Saturday, 30 May 2020 at 22:06:30 UTC, mw wrote:
> I want to generate a new symbol (new variable name) from 
> existing one: e.g. in C:
>
>
> $ cat t.c
> --------------------------------------------
> #define f(x) _##x
>
> int main() {
>   int f(x) = 3;
>   return _x;
> }
>
> $ make t
> cc     t.c   -o t
> $ ./t
> $ echo $?
> 3
> --------------------------------------------
>
> I wonder how to do this in D? using template / mixin? traits?
>
> Can you show me an example?
>
> Thanks.

enum f(string x) = "_" ~ x;

int main() {
   mixin("int ", f!"x", " = 3;");
   return _x;
}

This uses a templated [1] manifest constant [2] to generate the 
variable name at compile time, and a mixin statement [3] to 
insert the definition of `_x` into the program.

[1] https://dlang.org/spec/template.html#variable-template
[2] https://dlang.org/spec/enum.html#manifest_constants
[3] https://dlang.org/spec/statement.html#mixin-statement


More information about the Digitalmars-d-learn mailing list