properties
Michel Fortin
michel.fortin at michelf.com
Tue Jul 28 08:54:31 PDT 2009
On 2009-07-28 11:37:05 -0400, Andrei Alexandrescu
<SeeWebsiteForEmail at erdani.org> said:
> Michel Fortin wrote:
>> On 2009-07-28 10:16:16 -0400, Andrei Alexandrescu
>> <SeeWebsiteForEmail at erdani.org> said:
>>
>>> Well I don't think so. To repeat what I wrote elsethread: foo = bar is
>>> rewritten into foo(bar) if and only if auto __x = foo, __x = bar works.
>>> This means, a setter only works if there's a corresponding getter.
>>> (Write-only properties be damned.)
>>
>> This may lead to strange issues if both the setter and the getter don't
>> have the same protection attribute, or purity, or constness of
>> arguments.
>>
>> For instance:
>>
>> protected void foo(Object o);
>> public pure const const(Object) foo();
>>
>> Here, you can assign to foo using the property syntax only from a
>> non-pure functions of this class or a derived classes and when the
>> value you're assinging is a const(Object). Elsewhere, you can only
>> assign using the function syntax. Anything else would break "auto __x =
>> foo, __x = bar".
>
> Well I chose the rule that makes bar look and feel as much as an
> assignable value as possible. The rule could be relaxed (e.g. by
> dropping qualifiers), but that means we're departing from assignable
> value lookalike.
Also, what if a derived class implements a getter while the base class
only has a setter. Does that mean that only the derived class can use
the property syntax on the base class' setter?
What I don't like about that proposal is that that how to call a setter
is bound to the existence of another function in the same scope using
pretty non-obvious rules. Also, it doesn't solve the problem of the
getter that returns a delegate since you can continue using the
function notation with properties and you can continue to call
functions with no parenthesis.
While I like too being able to call functions with no argument by
skipping the tailing parenthesis, I'd easily give up on that if it
means I can get a language with less ambiguities.
I also happen to agree with Walter and you that it wouldn't be so great
to just decorate functions with a keyword to give them a different
syntax. I've propsed earlier a namespace-like syntax where you can have
functions like "foo.opAssign" inside a class (or anywhere really) that
you can call with "foo = x", unifying properties with operator
overloading.
--
Michel Fortin
michel.fortin at michelf.com
http://michelf.com/
More information about the Digitalmars-d
mailing list