static foreach and new identifier names

Meta jared771 at gmail.com
Sat Jan 6 00:05:19 UTC 2018


On Friday, 5 January 2018 at 23:52:43 UTC, Meta wrote:
> On Friday, 5 January 2018 at 23:50:52 UTC, Meta wrote:
>> On Friday, 5 January 2018 at 17:41:23 UTC, Adam D. Ruppe wrote:
>>> Make a special identifier known the compiler, let's call it 
>>> `__unique_name` which is unique for any static foreach 
>>> iteration.
>>
>> You can emulate it by abusing the compiler-generated random 
>> names for lambdas:
>>
>> enum uniqueName(string cookie = {}.stringof) = cookie;
>
> But that won't work for what you want. Never mind me.

Oho, template mixins to the rescue. With this you can auto 
generate all the new symbols you want and the syntax isn't too 
ugly.

mixin template uniqueName(DeclType, string cookie = {}.stringof)
{
     mixin(`DeclType ` ~ cookie ~ `;`);
     pragma(msg, cookie);
}

void main()
{
     static foreach (i; 0..50)
     {
         mixin uniqueName!int;
         mixin uniqueName!int;
     }
}

This prints:

__lambda5
__lambda6
__lambda7
__lambda8
__lambda9
__lambda10
__lambda11
__lambda12
__lambda13
__lambda14
__lambda15
__lambda16
__lambda17
__lambda18
__lambda19
__lambda20
__lambda21
__lambda22
__lambda23
__lambda24
__lambda25
__lambda26
__lambda27
__lambda28
__lambda29
__lambda30
__lambda31
__lambda32
__lambda33
__lambda34
__lambda35
__lambda36
__lambda37
__lambda38
__lambda39
__lambda40
__lambda41
__lambda42
__lambda43
__lambda44
__lambda45
__lambda46
__lambda47
__lambda48
__lambda49
__lambda50
__lambda51
__lambda52
__lambda53
__lambda54
__lambda55
__lambda56
__lambda57
__lambda58
__lambda59
__lambda60
__lambda61
__lambda62
__lambda63
__lambda64
__lambda65
__lambda66
__lambda67
__lambda68
__lambda69
__lambda70
__lambda71
__lambda72
__lambda73
__lambda74
__lambda75
__lambda76
__lambda77
__lambda78
__lambda79
__lambda80
__lambda81
__lambda82
__lambda83
__lambda84
__lambda85
__lambda86
__lambda87
__lambda88
__lambda89
__lambda90
__lambda91
__lambda92
__lambda93
__lambda94
__lambda95
__lambda96
__lambda97
__lambda98
__lambda99
__lambda100
__lambda101
__lambda102
__lambda103
__lambda104


More information about the Digitalmars-d mailing list