Is the -property compiler flag broken/bad idea?
Adam D. Ruppe
destructionator at gmail.com
Wed Jun 5 17:56:21 PDT 2013
On Thursday, 6 June 2013 at 00:08:31 UTC, Jonathan M Davis wrote:
> Which is essentially the position of weak property enforcement.
Yes, though I wish we would stop calling it 'enforcement' because
nothing actually needs to be especially enforced if we do it
right!
@property int foo();
foo(); // error, type int is not callable
@property void delegate() foo();
foo(); // works, calls the returned delegate.
This isn't a syntax case in the parser looking at syntax, it is a
natural consequence of the @property function call being
substituted for its return value.
Similarly btw:
&foo; // error, foo is not an lvalue
because foo here is a returned int or whatever. This isn't
directly substitutable for a plain "int foo", but that's ok
because one benefit of properties is we get to do things regular
members can't, like restrict read or write access like this.
@property ref int foo();
static assert(is(typeof(foo) == int));
static assert(is(typeof(&foo) == int*));
foo = 10; // ok
that works now because ref int is an lvalue. An @property
returning a reference is one case were we should be able to get
(almost*) 100% substitution between it and a regular member
variable.
* __traits(propertyImplementation, foo) or something like that
might still show something different, but if you're using that
kind of thing, it is clear that you want special access anyway.
I've tried to implement this in the compiler before. It seems
like it would be a simple case of a semantic rewrite of "foo"
into "foo()" iff foo is @property as soon as you see it. But the
implementation is hard because of things like setters. foo = 10
should be rewritten into foo(10), but that's easier said than
done - it either has to undo the foo->foo() rewrite on the left
hand side, then look for the matching setter, or the rewrite has
to be moved.... and moving it means duplicating it in all the
bazillion places it can be referenced.
So my attempt got 90% to where I wanted pretty easily, but that
last 10% is a hell of a bump in the road and I haven't figured it
out yet. A working pull request would surely be a big step toward
closing this discussion once and for all, I wish I had more free
time, I have so much D I want to hack on!
More information about the Digitalmars-d-learn
mailing list