Michel Fortin wrote:
On 2009-07-28 11:37:05 -0400, Andrei Alexandrescu <[email protected]> said:

Michel Fortin wrote:
On 2009-07-28 10:16:16 -0400, Andrei Alexandrescu <[email protected]> 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?

It all follows normal language rules. That's what I like about rewrites (lowerings): they allow you to reason about a new mini-feature (that in this case is absolutely nothing beyond a minor syntactic convenience) in terms of the rest of the language.

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.

I think the rules are very obvious.

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.

It doesn't solve the problem with a getter that returns a delegate. People who want to return delegates must use an extra pair of parens.

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 wouldn't want to hurt the majority of my code for an obscure case. I do agree I'd rather not have an obscure case in the first place.

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.

That would work. Many things would work.


Andrei

Reply via email to