Dollar identifiers in code-generating constructs
Quirin Schroll
qs.il.paperinik at gmail.com
Tue Jul 16 11:39:58 UTC 2024
On Monday, 15 July 2024 at 17:50:10 UTC, Meta wrote:
> On Wednesday, 3 July 2024 at 10:25:14 UTC, Quirin Schroll wrote:
>> A dollar identifier is an
>> [*`Identifier`*](https://dlang.org/spec/lex.html#Identifier)
>> with a `$` at the end. In a code-generating construct
>> (mixed-in `mixin template` and `static foreach`/`static
>> foreach_reverse`) the `$` is replaced by a number.
>>
>> For a loop, it is the index of iteration.
>>
>> For a mixin template, it is the number of mixin templates
>> mixed in up until this point.
>>
>> ---
>>
>> ### Example: loop
>>
>> ```d
>> enum xs = ["A", "BC", "DEF"];
>> static foreach (x; xs)
>> {
>> size_t l = x.length; // Error on "BC" and "DEF", already
>> defined.
>> }
>> ```
>>
>> ```d
>> enum xs = ["A", "BC", "DEF"];
>> static foreach (x; xs)
>> {
>> size_t l$ = x.length; // Good: becomes `l0`, `l1`, `l2`
>> }
>> ```
>>
>> ### Example: mixin template
>>
>> ```d
>> mixin template mixMeIn(T)
>> {
>> alias R = int delegate(T);
>> }
>>
>> struct S
>> {
>> mixin mixMeIn!int; // Okay
>> mixin mixMeIn!int; // Error, `R` already defined
>> }
>> ```
>>
>> ```d
>> mixin template mixMeIn(T)
>> {
>> alias R$ = int delegate(T);
>> }
>>
>> struct S
>> {
>> mixin mixMeIn!int; // Okay, defines `R0`
>> mixin mixMeIn!int; // Okay, defines `R1`
>> }
>> ```
>
> This is very similar to a proposal by Timon Gehr to add
> `__local` variables that are local to static foreach bodies:
> https://github.com/dlang/DIPs/blob/master/DIPs/accepted/DIP1010.md#local-declarations
It’s different because my symbols aren’t local. Even if both
features could be used for the same end, they end up being quite
different. What you do with `R0`, `R1`, etc. is up to you.
They’re visible and have predictable names. If you define `R0`
elsewhere, the names clash. `__local` on the other hand would
hide the symbols outside the loop/template. Whether you want a
simple mechanism to generate predictable different names or make
symbols basically private is up to your use case.
More information about the dip.ideas
mailing list