Properties: a.b.c = 3

Steven Schveighoffer schveiguy at yahoo.com
Wed Jul 29 14:37:13 PDT 2009


On Wed, 29 Jul 2009 15:00:42 -0400, Ary Borenszweig <ary at esperanto.org.ar>  
wrote:

> Steven Schveighoffer Wrote:
>
>> On Wed, 29 Jul 2009 14:50:42 -0400, Ary Borenszweig  
>> <ary at esperanto.org.ar>
>> wrote:
>>
>> > Steven Schveighoffer wrote:
>> >> On Wed, 29 Jul 2009 14:39:07 -0400, Ary Borenszweig
>> >> <ary at esperanto.org.ar> wrote:
>> >>
>> >>> a.b.c = d;
>> >>>
>> >>> If b is anything that has a struct type, and c is anything else, the
>> >>> statement must report an error.
>> >>  struct S
>> >> {
>> >>   int *x;
>> >>   void c(int n) {*x = n;}
>> >> }
>> >>  struct S2
>> >> {
>> >>   int n;
>> >>   S b() { return S(&n);}
>> >> }
>> >>  void main()
>> >> {
>> >>   S2 a;
>> >>   a.b.c = 5;
>> >> }
>> >>  Why should this not be allowed?
>> >
>> > Because in the general case it might not work.
>> >
>> > It's simple: if you disallow it, no bugs caused because of this can
>> > exist. If you don't disallow it, sometimes it might work, sometimes it
>> > won't work. Which option do you prefer as a programmer?
>>
>> I prefer to have the power to create whatever I want without the  
>> compiler
>> telling me incorrectly that it won't work.
>>
>> why allow any programming at all?  The programmer might write incorrect
>> code!
>>
>> -Steve
>
> I reply using the web page because Thunderbird gives me a Bad Request  
> error (very strange).

I retracted my original message (just found out how to do that), because I  
wrote "...without the telling me..." instead of "...without the *compiler*  
telling me..."

You probably tried to reply to my original message ;)

>
> The cases where you do:
>
> a.b.c = 3;
>
> where b is a struct are probably few

Let's not forget that structs are the vehicle to extend the type system.   
I want to make my own pointer type, it has to be a struct.  You're going  
to predjudice the compiler against my wrapper types because I *might* do  
something that confuses people.

> and most of the time they lead to incorrect result, such as the Widget  
> and Rectangle examples, and many others.

In fact, this is the *only* example I've seen.  It leads me to believe we  
need a better approach to widgets and rectangles more than a better  
approach to properties.  Like maybe making Rectangles and Points  
immutable?  I think that's how C# does it.

> So I prefer the compiler to tell me "Look, b is a struct, please make  
> sure you know what you are doing". And I can tell you, most of the time  
> you'll say "Thanks, compiler, I didn't notice that!". If the compiler is  
> wrong, you just do:
>
> auto x = a.b;
> b.c = 3;
>
> and that's it. No big deal.

It is a big deal.  Ever used Vista?  It has a similar conservative  
approach to security.  It makes Vista unusable in my opinion.

-Steve



More information about the Digitalmars-d mailing list