Steven Schveighoffer wrote:
The "getter" notation that currently exists only has a few minor problems. The most major of those problems is if the return value is a callable type, such as a delegate, you can't easily perform the call on the returned value.

Thanks for a very lucid analysis! So let me give an example:

class A
{
    int delegate() wyda()
    {
        return delegate int() { return 5; };
    }
}

void main(string[] args)
{
    auto a = new A;
    auto b = a.wyda;
    writeln(typeof(b).stringof);
    auto c = a.wyda();
    writeln(typeof(c).stringof);
    auto d = a.wyda()();
    writeln(typeof(d).stringof);
    auto e = &a.wyda;
    writeln(typeof(e).stringof);
}

This program prints:

int delegate()
int delegate()
int
int delegate() delegate()

I agree that that's an issue. One can't currently implement transparently a property that returns a delegate taking no arguments. There's an extra () needed.

Being that it isn't very bad for the getter property, would it make sense to leave that functionality? That is:

1. A setter must be defined in the opSet_X(int x) form
2. A getter can be a function with no required arguments, but this getter should not return callable types

... with zero arguments.

3. A getter can be defined in the opGet_X() form, and then using X() will be the eqivalent of opGet_X()().

There are small implications to leaving the existing getter syntax. Namely one can call a function not intended to be a getter in a property-like syntax, resulting in less-than-obvious code.

This I don't agree with. I am very happy that I define popFront() as a method and then call it without parens.

Also, this distinction will be very hard to explain to newbies ("how come a getter is defined as x(), but a setter has to be opSet_x(...)?).

I don't see that as a problem. You just explain that the trailing () is not necessary, and then you tell them to define opSet_x if they want to enable obj.x = y.

The more I look at it, the more I like the keyword solution. I do find the C#-like syntax which groups properties together appealing, but I think you only absolutely need that if you are going to have context-keywords, which I DON'T think we need. I do find the whole construct of C# properties tedious to type.

With a keyword attribute, you could even group your properties together to save on typing/ugliness:

property
{
   int x() {}
   void x(int n) {}
   bool empty() {}
}

Not a fan, but this would work. I just don't see why I need to go through with it.


Andrei

Reply via email to