`alias x = v.x;` not working in struct bodies?

Basile B. b2.temp at gmx.com
Mon Jan 22 14:06:42 UTC 2024


On Sunday, 21 January 2024 at 19:45:03 UTC, FeepingCreature wrote:
> On Sunday, 21 January 2024 at 15:03:15 UTC, Basile B. wrote:
>> On Sunday, 21 January 2024 at 13:18:07 UTC, FeepingCreature 
>> wrote:
>>> I have a hard time understanding what problem you're 
>>> describing, but it's probably fine? Expression aliases are 
>>> evaluated in the context of the declaration site, not the 
>>> call site. This doesn't involve the grammar at all.
>>
>> I'm talking about that:
>>
>> ```d
>> struct B
>> {
>>     int i;
>> }
>>
>> struct A
>> {
>>     B b;
>>     alias cmp = (b.i == 0);
>> }
>>
>> void main()
>> {
>>     A a;
>>     if (a.cmp) {} // a.(b.i == 0)
>>                   // but user wants (a.b.i) == 0
>> }
>> ```
>>
>> You cant just rewrite them as DotExp otherwise operands are 
>> not evaluated properly, or like in the example, invalid 
>> expressions are generated.
>
> `if (a.(b.i == 0))` is actually syntactically correct in Neat 
> and will result in the same outcome. :-)
>
> But I think you're still looking at it at too high a level.
> `a.cmp` is not *rewritten* as `a.(b.i == 0)`, rather 
> syntactically it stays as `a.cmp`, and the *lookup* for "cmp" 
> results in the *evaluation* of `(b.i == 0)`, or `(this.b.i == 
> 0)`, in the context of `thisptr = &a`. It's not a term 
> rewriting system.

I see, you handle the context more like it would be a with-stmt. 
I tend to forgot that not all compilers are not designed like 
DMD, to conclude on this off topic ;)


More information about the Digitalmars-d mailing list