properties

Andrei Alexandrescu SeeWebsiteForEmail at erdani.org
Mon Jul 27 15:37:01 PDT 2009


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



More information about the Digitalmars-d mailing list