property syntax strawman
Steven Schveighoffer
schveiguy at yahoo.com
Mon Aug 3 07:19:11 PDT 2009
On Mon, 03 Aug 2009 10:14:14 -0400, John C <johnch_atms at hotmail.com> wrote:
> Steven Schveighoffer wrote:
>> On Sun, 02 Aug 2009 15:23:44 -0400, John C <johnch_atms at hotmail.com>
>> wrote:
>>
>>> Andrei Alexandrescu wrote:
>>>> Michiel Helvensteijn wrote:
>>>>> Andrei Alexandrescu wrote:
>>>>>
>>>>>> Then in a later message you mention:
>>>>>>
>>>>>> bool empty.get() { ... }
>>>>>> void empty.set(bool b) { ... }
>>>>>>
>>>>>> which I like and which does not seem to have difficulties; the names
>>>>>> "get" and "set" will be never used as such.
>>>>>
>>>>> Yes, those are two notations for the same thing, and they have the
>>>>> same
>>>>> problem. Let me demonstrate:
>>>>>
>>>>> --------------------------------------------------
>>>>> struct S {
>>>>> int get() { return 42; }
>>>>> };
>>>>>
>>>>> struct T {
>>>>> S _s;
>>>>> S property.get() { return _s; }
>>>>> void property.set(S s) { _s = s; }
>>>>> }
>>>>>
>>>>> T t;
>>>>>
>>>>> auto X = t.property.get();
>>>>> --------------------------------------------------
>>>>>
>>>>> What is the type of X? It can be either S or int, depending on how D
>>>>> handles
>>>>> the situation.
>>>>>
>>>>> The ambiguity is in the possibility to directly reference the getter
>>>>> and
>>>>> setter methods. In that other subthread (the older one) I listed some
>>>>> possible solutions.
>>>>>
>>>>> The first is to make such a program an error.
>>>>>
>>>>> The second is not to allow a direct reference to a getter/setter (so
>>>>> X is an
>>>>> int).
>>>>>
>>>>> The third is to let the getter/setter overshadow S members (so X is
>>>>> an S).
>>>> I see. My view is that .get and .set are simply symbolic
>>>> placeholders, but indeed some may get confused.
>>>> Andrei
>>>
>>> Does the ambiguity go away if we replace the '.' with a space?
>>>
>>> Declaration:
>>>
>>> bool empty get();
>>> void empty set(bool);
>>>
>>> Declaration:
>>>
>>> bool empty get() { return empty_; }
>>> void empty set(bool b) { empty_ = b; }
>> The ambiguity of declaration, not the ambiguity of usage, unless you
>> want to use the space to denote the usage also?
>> -Steve
>
> Not sure where the ambiguity is with usage. To keep things simple, 'get'
> and 'set' should only be valid at the point of declaration. They're not
> really part of the function name.
Currently, since properties are simply functions, you can take the
delegate of a setter.
So the poster who started this trail of the thread is assuming that
t.property.get()
identifies the property getter directly. But what if the return type of
t.property.get() contains a method get()? Since t.property is an alis for
t.property.get(), Should t.property.get() map to:
t.property
or
(t.property).get() // get the property, then call it's get function.
That is the ambiguity.
-Steve
More information about the Digitalmars-d
mailing list