On Tuesday, 6 September 2016 at 19:37:26 UTC, Jonathan M Davis wrote:
On Tuesday, September 06, 2016 19:18:11 John via Digitalmars-d wrote:
Currently it seems that @property isn't implemented correctly. For some reason when you try to get the pointer of a property it returns a delegate for some reason. This just seems plain wrong, the whole purpose of a property is for a function to behave as if it weren't a function. There's also some inconsistencies in the behavior, "get" is implemented one way and then "set" is implemented another.

http://ideone.com/ZgGT2G

     &t.x         // returns "ref int delegate()"
     &t.x()       // ok returns "int*", but defeats purpose of
@property
&(t.j = 10) // shouldn't this return "ref int delegate(int)"
?

It would be nice to get this behavior fixed, so that it doesn't become set in stone. I think returning a delegate pointer is not what people would except nor is there really any use case for it.

Okay. How would it work to safely get a pointer to anything but the @property function when taking its address? &t.x() is just going to give you the address of the return value - which in most cases, is going to be a temporary, so if that even compiles in most cases, it's a bit scary. Sure, if the @property function returns by ref, then it can work, but an @property function which returns by ref isn't worth much, since you're then giving direct access to the member variable which is what an @property function is usually meant to avoid. If you wanted to do that, you could just use a public member variable.

So, given that most @property functions are not going to return by ref, how does it make any sense at all for taking the address of an @property function to do anything different than give you a delegate? Sure, that's not what happens when you take the address of a variable, but you're not dealing with a variable. You're dealing with an @property function which is just trying to emulate a variable.

The reality of the matter is that an @property function is _not_ a variable. It's just trying to emulate one, and that abstraction falls apart _really_ fast once you try and do much beyond getting and setting the value - e.g. passing by ref falls flat on its face. We could do better than currently do (e.g. making += lower to code that uses both the getter and the setter when the getter doesn't return by ref), but there are some areas where a property function simply can't act like a variable, because it isn't one. There isn't even a guarantee that an @property function is backed by memory. It could be a completely calculated value, in which case, expecting to get an address of a variable when taking the address of the @property function makes even less sense.

- Jonathan M Davis

I don't see how that would be a problem, you can't take the address of an rvalue... The problem you describe would be true for functions as well. What's not true is that it is compilable (see: http://ideone.com/MXhkXC ). Any problem you can conjure up about references, temporary values and pointers, all of that would be true for a regular function as well.

Obviously it is not a variable, but if you use a function and it returns a reference and you take the address of it. What you get is the address of the returned value not of the function. int v = obj.prop; if you look at that "prop" is a called function pretending to be a variable. If you take the address of a called function, you get the address of the returned variable, not the function. If you take the address of a variable, you get the address of the variable.

On Wednesday, 7 September 2016 at 07:44:05 UTC, Ethan Watson wrote:
On Tuesday, 6 September 2016 at 19:18:11 UTC, John wrote:
It would be nice to get this behavior fixed.

Disagree. I've used properties before in C# to transform to and from data sets required for network multiplayer. It works functionally the same way in D. Behaviour is as I would expect for the wider implications of how properties can work.

You can't really take one sentence out of context, I didn't say it in the sense that it was completely broken to the point of being useless. The part I'm asking to be changed, you probably didn't even ever use. C# is a managed language, I don't think you can even take the pointer of anything unless you enable the unsafe switch.


On Tuesday, 6 September 2016 at 19:34:59 UTC, ag0aep6g wrote:
On 09/06/2016 09:18 PM, John wrote:
&(t.j = 10) // shouldn't this return "ref int delegate(int)" ?

`&t.j` should and does. With `= 10`, it's definitely a call, just like `&t.x()`.

It would be nice to get this behavior fixed, so that it doesn't become
set in stone.

Unfortunately, it already kinda is. Just flipping the switch would break circa all D code in existence. That's deemed unacceptable by the leadership, as far as I know.

Don't really see that to be true. I don't see any use case for taking the address of the delegate for a property. Wouldn't be surprised if it only broke 1% of code out there. I mean it's probably used so little that it isn't even properly implemented. You can get the getter property delegate, but you can't get the setter property delegate. Either way it's broken as it is now.

Reply via email to