Revised RFC on range design for D2

Steven Schveighoffer schveiguy at yahoo.com
Wed Oct 1 06:58:02 PDT 2008


"KennyTM~" wrote
> Simen Kjaeraas wrote:
>> On Wed, 01 Oct 2008 07:58:20 +0200, Benji Smith 
>> <dlanguage at benjismith.net> wrote:
>>
>>> Bill Baxter wrote:
>>>> On Tue, Sep 30, 2008 at 3:36 AM, Steven Schveighoffer
>>>> <schveiguy at yahoo.com> wrote:
>>>>>> There is no ambiguity either case. You evaluate Stdout.newline. The
>>>>>> evaluation yields a value of some type. Then you evaluate formatln 
>>>>>> against
>>>>>> that value.
>>>>> OK, then tell me what this does:
>>>>>
>>>>> x.y.z();
>>>>>
>>>>> Is y a property/field of x or a function call with no args?  I see a 
>>>>> benefit
>>>>> to being able to understand a line of code without requiring lots of 
>>>>> extra
>>>>> context.  I have to do less lookups of the source of a function or 
>>>>> property.
>>>>  The problem with this argument is that unless you disallow properties
>>>> altogether, you still won't know whether y is actually a field or a
>>>> call to a property method without looking it up.
>>>>  --bb
>>>
>>> One thing that I've found especially annoying about the current 
>>> implementation is this:
>>>
>>>    x.y = 3; // Working code
>>>    x.y += 3; // Broken, if x.y is actually a function
>>>    x.y = x.y + 3; // Ugly work-around
>>>
>>> I've been bitten by this at least a dozen different times. Having a real 
>>> property syntax would eliminate cases like that.
>>>
>>> --benji
>>
>> It seems we will soon get reference return values, in which case this 
>> would
>> no longer be a problem. I have also written a property template that 
>> enables
>> things such as that, but it would also benefit immensely from reference
>> return values.
>>
>
> It's still an issue if we want to support property setters, say
>
>   class Time {
>     private double seconds;
>
>     invariant /*pure?*/ double minutes () { return seconds/60.; }
>     void minutes (invariant double x) { seconds = x*60.; }
>   }
>
> You cannot return a double& when calling .minutes because it simply does 
> not exist. Therefore, the interpreter have to clever enough to convert
>
>   t.minutes += 2;
>
> into
>
>   t.minutes = t.minutes + 2;
>
> i.e.
>
>   t.minutes(t.minutes() + 2);
>
> if .minutes does not return a reference. A similar problem also exist with 
> .opIndexAssign and .opSliceAssign.

Yes yes!

vote++

-Steve 




More information about the Digitalmars-d-announce mailing list