DIPX: Enum Literals / Implicit Selector Expression

Paul Backus snarwin at gmail.com
Thu Dec 2 20:38:08 UTC 2021


On Thursday, 2 December 2021 at 19:44:07 UTC, russhy wrote:
> # DIPX: Enum Literals / Implicit Selector Expression
>
[...]
>
> Link: 
> https://gist.github.com/RUSShyTwo/2fcf6d294d25ba748d61927b5eed2944

First impressions:

```d
enum MyTag
{
     A, B, C
}
MyTag tag = .A;
```

This looks like it can be made to work very easily, although I am 
not convinced it is a huge improvement compared to just using 
`auto`:

```d
auto tag = MyTag.A;
```

Meanwhile, this:

```d
void what(MyTag tag)
{}
what(.B);
```

...is potentially troublesome, because it is grammatically 
ambiguous with the [module scope operator][1]. For example:

```d
enum MyTag { A, B, C }
int B = 42;
void what(MyTag) {}

void example()
{
     what(.B);
     // Error: function `what` is not callable using argument 
types `(int)`
}
```

We would need some rule like, "if an expression of the form 
`.Identifier` fails to compile, the compiler will attempt to 
rewrite it as `EnumName.Identifier`, where `EnumName` is the name 
of an enum visible in the current scope."

This raises several follow-on questions:

* What do we do if there are multiple enums with matching members?
* What if one of those enums is in the current module, and one is 
imported?
* Do we need a rule to prevent enum members from being "hijacked" 
by global variables?
* When instantiating templates, do we search enum types passed as 
template parameters, or just enums in the template declaration's 
lexical scope?

[1]: https://dlang.org/spec/module.html#module_scope_operators


More information about the Digitalmars-d mailing list