Thread overview
Trying to understand a simple piece of code: dmd barray
Mar 07, 2020
Dibyendu Majumdar
Mar 07, 2020
drug
Mar 07, 2020
Dibyendu Majumdar
Mar 07, 2020
Dibyendu Majumdar
Mar 07, 2020
Ferhat Kurtulmuş
March 07, 2020
Hi,

I am trying to understand https://github.com/dlang/dmd/blob/master/src/dmd/backend/barray.d.

Two questions:

1. What does this mean and why is it needed?

line 95: alias array this;

2. The struct has no property called length - but this is referenced. Where does this come from?

Thank you

Regards
March 07, 2020
07.03.2020 15:05, Dibyendu Majumdar пишет:
> Hi,
> 
> I am trying to understand https://github.com/dlang/dmd/blob/master/src/dmd/backend/barray.d.
> 
> Two questions:
> 
> 1. What does this mean and why is it needed?
> 
> line 95: alias array this;
> 
This means that `array` can be used instead of `this`
> 2. The struct has no property called length - but this is referenced. Where does this come from?
it comes from `array` being alias for `this`, see above
> 
> Thank you
> 
> Regards

March 07, 2020
On 3/7/20 7:26 AM, drug wrote:
> 07.03.2020 15:05, Dibyendu Majumdar пишет:
>> Hi,
>>
>> I am trying to understand https://github.com/dlang/dmd/blob/master/src/dmd/backend/barray.d.
>>
>> Two questions:
>>
>> 1. What does this mean and why is it needed?
>>
>> line 95: alias array this;
>>
> This means that `array` can be used instead of `this`

To expand on this, the compiler basically substitutes the symbol aliased here for the item itself if all other members are a compiler error.

So for example, if you have:

barr.length;

and barr has no member length, it tries:

barr.array.length

-Steve
March 07, 2020
On Saturday, 7 March 2020 at 12:26:32 UTC, drug wrote:

>> I am trying to understand https://github.com/dlang/dmd/blob/master/src/dmd/backend/barray.d.
>> 
>> Two questions:
>> 
>> 1. What does this mean and why is it needed?
>> 
>> line 95: alias array this;
>> 
> This means that `array` can be used instead of `this`

Hmm should not that change the meaning of this throughout the struct? is this good practice?

Thank you

March 07, 2020
On 3/7/20 8:06 AM, Dibyendu Majumdar wrote:
> On Saturday, 7 March 2020 at 12:26:32 UTC, drug wrote:
> 
>>> I am trying to understand https://github.com/dlang/dmd/blob/master/src/dmd/backend/barray.d.
>>>
>>> Two questions:
>>>
>>> 1. What does this mean and why is it needed?
>>>
>>> line 95: alias array this;
>>>
>> This means that `array` can be used instead of `this`
> 
> Hmm should not that change the meaning of this throughout the struct? is this good practice?

No, it's simply a fallback. If the symbol doesn't work with this.symbol, try this.array.symbol.

It's D's version of implicit conversion.

You can make the alias this a no-arg function and it will try calling that function.

-Steve
March 07, 2020
On Saturday, 7 March 2020 at 13:06:39 UTC, Dibyendu Majumdar wrote:
> On Saturday, 7 March 2020 at 12:26:32 UTC, drug wrote:
>
>>> I am trying to understand https://github.com/dlang/dmd/blob/master/src/dmd/backend/barray.d.
>>> 
>>> Two questions:
>>> 
>>> 1. What does this mean and why is it needed?
>>> 
>>> line 95: alias array this;
>>> 
>> This means that `array` can be used instead of `this`
>
> Hmm should not that change the meaning of this throughout the struct? is this good practice?
>
> Thank you

This is also a way of imitating inheritance in c-ish code without classes.
March 07, 2020
On Saturday, 7 March 2020 at 14:33:29 UTC, Steven Schveighoffer wrote:
>
> It's D's version of implicit conversion.
>
> You can make the alias this a no-arg function and it will try calling that function.
>

Okay thank you.