Dollar identifiers in code-generating constructs

Quirin Schroll qs.il.paperinik at gmail.com
Wed Jul 3 10:25:14 UTC 2024


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`
}
```


More information about the dip.ideas mailing list