On Sun, 03 Feb 2013 03:16:08 -0500, Andrei Alexandrescu <[email protected]> wrote:

Walter and I have had a discussion on how to finalize properties.

http://wiki.dlang.org/DIP23

I agree with everything in this. This looks exactly like what I wanted a few days ago. Thank you!

One aspect not addressed is free-function properties:

@property int foo(int x) {return x * 5;}

could be interpreted as:

foo = 2; // not correct (for this example)

int x = 2.foo; // correct

Note that:

@property int foo();
@property void foo(int x, int y);

are both unambiguous.

==================

I have a possible suggestion to fix this within your proposal:

@property on single-arg free functions ONLY enables a setter mode, it does not work as a UFCS getter.

Therefore, if you wish to write a UFCS getter, omit the @property designation.

int foo(int x) {return x * 5;}

foo = 2; // illegal
int x = 2.foo; // OK, sets x to 10
int x = foo(2); // same as above

@property int foo(int x) {_foo = x;}

foo = 2; // OK, sets _foo to 2
int x = 2.foo; // illegal
int x = foo(2); // illegal

I know this is not a complete solution, and can be confusing, but we have little options at this point, given existing code. Also note that we already have a way to specify a getter property on a user-defined type, UFCS isn't entirely necessary for that.

This will break SOME declarations, but removing @property should result in compiling code I think.

-Steve

Reply via email to