Revised RFC on range design for D2

Andrei Alexandrescu SeeWebsiteForEmail at erdani.org
Mon Sep 29 10:23:58 PDT 2008


Sergey Gromov wrote:
> Sun, 28 Sep 2008 22:53:13 -0500,
> Andrei Alexandrescu wrote:
>> Bill Baxter wrote:
>>> The rule is trivial, you may say.  But how about co-variant return
>>> types?  If FooSub is a subclass of Foo, then is it ok for the getter
>>> to return one and setter to take the other?  Or vice versa?  Or how
>>> about implicit conversions.  If my getter takes a long, but my setter
>>> returns an int, is that ok?  How do const variations fit in?  Probably
>>> there's a way to fit those all neatly in an automatic rule (or just
>>> disallow them), but it just makes the rule longer and even harder to
>>> keep in mind (or cuts off functionality people may need).
>> Yah, I was thinking of all these and then some more while I was posting.
>>
>> I think it's another duck typing thing. If you can call:
>>
>> entity.prop(entity.prop);
>>
>> then you can consider prop a property, period. Entity could be anything 
>> that allows the dot member access (object, class, struct, union, 
>> template, or module). Given that there is no global scope in D, that 
>> takes care of everything. I think it's really hard to get any simpler 
>> than that.
> 
> D has a simple rule for property methods.  This rule has side effects.  
> If the side effects are so bad that a hack is required to counter them,
> then the rule should be replaced with a better one.  Otherwise your hack 
> will inevitably introduce new, less obvious side effects than those it 
> were supposed to fight, and will finally require other hacks.
> 
> struct Range
> {
>   ref int head() {...}
> }
> Range r;
> r.head = 5; // error

A function can return an object that allows assignment even today with 
opAssign.

I said "If you can call: entity.prop(entity.prop); then you can consider 
prop a property, period." I did not say "If and only if".


Andrei


More information about the Digitalmars-d-announce mailing list