Properties: a.b.c = 3

Steven Schveighoffer schveiguy at yahoo.com
Wed Jul 29 11:52:37 PDT 2009


On Wed, 29 Jul 2009 14:46:11 -0400, Chad J  
<chadjoan at __spam.is.bad__gmail.com> wrote:

> grauzone wrote:
>> Steven Schveighoffer wrote:
>>> On Wed, 29 Jul 2009 10:16:33 -0400, grauzone <none at example.net> wrote:
>>>
>>>> Daniel Keep wrote:
>>>>> Maybe the compiler could rewrite the above as:
>>>>>  auto t = a.b;
>>>>> t.c = 3;
>>>>> a.b = t;
>>>>>  Unless it can prove it doesn't need to.  Same solution as to the op=
>>>>> conundrum.
>>>>
>>>> Yes! At least that's what the user wants.
>>>>
>>>> The compiler has to detect, that the object was modified at all. (To
>>>> know whether it should generate code to write back the property.)
>>>> Would this make the compiler much complexer?
>>>>
>>>> You also have to deal with nested properties:
>>>>
>>>> a.b.c.d = 3;
>>>>
>>>> turns to
>>>>
>>>> auto t = a.b;
>>>> auto t2 = t.c;
>>>> c.d = 3;
>>>> t.c = t2;
>>>> a.b = t;
>>>>
>>>> ???
>>>
>>> Yeah, I think this idea is no good.  a.b.c.d.e.f = 3, results in one
>>> gigantic mess, which the user might not want.
>>
>> I don't want to type out that mess as a user either...
>>
>> Design changes to avoid that mentioned mess would interfere with the
>> goal of abstraction (e.g. assume you have widget.position, now how do
>> you set only the x coordinate? yeah, split the property into position_x
>> and position_y. Result is you have more noise, and you can't use a Point
>> struct.)
>>
>> As for the rest, I'm sure all of you will have figured it out after some
>> more ~500 postings.
>
> But you don't /have/ to type out that mess!  Why would anyone do that?!
>  It's madness.
>
> The compiler does it FOR you.  That's why it's there.  It is supposed to
> save you from doing tedious work.
>
> Currently there are some cases where the current paradigm forces you to
> do that kind of work by hand:
>
> struct Rectangle
> {
> 	float x,y,w,h;
> }
>
> class Widget
> {
> 	Rectangle _rect;
> 	Rectangle rect() { return _rect; }
> 	Rectangle rect(Rectangle r) { return _rect = r; }
> 	// etc
> }
>
> void main()
> {
> 	auto widget = new Widget();
>
> 	// DOES WORK:
> 	auto tmp = widget.rect;
> 	tmp.w = 200;
> 	tmp.h = 100;
> 	widget.rect = tmp;
>
> 	// DOES NOT WORK:
> 	// widget.rect.w = 200;
> 	// widget.rect.h = 100;
> }

Wouldn't the compiler write:

//widget.rect.w = 200 translates to
auto tmp1 = widget.rect;
tmp1.w = 200;
widget.rect = tmp1;

//widget.rect.h = 100 translates to
auto tmp2 = widget.rect;
tmp2.h = 100;
widget.rect = tmp2;

???

Unless you want some serious optimization requirements...

-Steve



More information about the Digitalmars-d mailing list