Uniform Function Call syntax for properties

Denis Koroskin 2korden at gmail.com
Sat Oct 9 21:58:39 PDT 2010


On Sun, 10 Oct 2010 08:44:59 +0400, Robert Jacques <sandford at jhu.edu>  
wrote:

> On Sat, 09 Oct 2010 22:03:56 -0400, Denis Koroskin <2korden at gmail.com>  
> wrote:
>
>> On Sun, 10 Oct 2010 05:58:00 +0400, Robert Jacques <sandford at jhu.edu>  
>> wrote:
>>
>>> On Sat, 09 Oct 2010 16:28:32 -0400, Denis Koroskin <2korden at gmail.com>  
>>> wrote:
>>>
>>>> On Sun, 10 Oct 2010 00:09:23 +0400, Sean Kelly  
>>>> <sean at invisibleduck.org> wrote:
>>>>
>>>>> Andrei Alexandrescu <SeeWebsiteForEmail at erdani.org> wrote:
>>>>>> On 10/8/10 7:55 CDT, Steven Schveighoffer wrote:
>>>>>>> Someone was asking about UFC syntax for properties on d.learn, and  
>>>>>>> I
>>>>>>> realized, we have a huge ambiguity here.
>>>>>>>
>>>>>>> Given a function:
>>>>>>>
>>>>>>> @property int foo(int x)
>>>>>>>
>>>>>>> Is this a global setter or a getter on an int?
>>>>>>
>>>>>> Good question.
>>>>>
>>>>> Setter. Consider "a = b = c".
>>>>
>>>> I think you missed the point. Which of the two is it:
>>>>
>>>> int x = 42;
>>>> auto y = x.foo(); // transformed into "auto y = foo(x);", getter
>>>>
>>>> or
>>>>
>>>> foo = 42; // transformed into "foo(42);", setter
>>>>
>>>> Both match.
>>>
>>> I agree that there is ambiguity here, but does it why does foo have to  
>>> be only a getter or only a setter? Why can't it behave like either,  
>>> depending on its implementation and use?
>>
>> Because you may want to have both, but you can't because their syntax  
>> overlap.
>
> Okay I'm confused. How do their syntax overlap? And which syntaxes do  
> you think are overlapping?
> All the following 'lowerings' look fine/unambiguous to me:
>
> foo = 42; => foo(42);
> y = x.foo; => y = x.foo(); => y = foo(x);
> foo = foo = x.foo; => foo = foo = x.foo(); => foo = foo = foo(x); => foo  
> = foo(foo(x)); => foo(foo(foo(x)));

I wasn't talking about ambiguity. I told that you can't assign different  
behavior to

foo = 42;

and

y = x.foo;

Both are resolving to the same symbol.

E.g. I'd like to write a setter, "foo = 42;":

private int _foo;
int foo(int x)
{
     debug writeln("foo = ", x);
     _foo = x;
     return x;
}

But the following code also triggers the setter above:

y = 42.foo(); // prints "foo = 42;", sets private variable _foo to 42, and  
returns that value

That's completely unexpected. Imagine yourself writing class Foo with  
method bar, and a user who highjacks a hole in the language, creates class  
bar, and invokes method Foo on it. That's what it looks like at this  
moment.


More information about the Digitalmars-d mailing list