Possible @property compromise

Steven Schveighoffer schveiguy at yahoo.com
Thu Jan 31 20:33:05 PST 2013


On Thu, 31 Jan 2013 19:59:46 -0500, Zach the Mystic  
<reachBUTMINUSTHISzach at googlymail.com> wrote:

> I think my suggestion goes far beyond what you suspect. It goes way  
> beyond mere getting and setting of variables. Here is basically how you  
> implement a basic int as a property, assuming my new syntax and language  
> adjustments. You need: 1) a struct to have the property in, which is  
> just a normal struct. 2) An actual integer which will be indirectly  
> accessed by using the properties. Let's call it "_n" and the property  
> "n". 3) a struct to hold all of the property functions which access _n.  
> THIS STRUCT CONTAINS NO DATA OF ITS OWN. 4) A bunch of methods  
> implementing all the operators you want. For int, that's quite a lot, so  
> I'll shorten it to a getter, a setter, and an adder. I'll even leave out  
> opGet and use an alias to what might as well be opGet. I'll give the  
> adder a little personality because what's the point of properties if  
> they don't do something different from a basic type?
>
> struct myStruct
> {
>    int _n;
>    n struct
>    {
>      int __mightAsWellBeOpGet() { return _n; }
>      alias __mightAsWellBeOpGet this;
>
>      int opAssign(int newN) { _n = newN; return _n; }
>      int opBinary(string op) (int rhs)
>      {
>        static if (op == "+")
>        {
>          writeln("You sure are adding a funky int, my friend...");
>          return _n + rhs;
>        }
>        else static assert(0, "Operator "~op~" not implemented");
>      }
>    }
> }
>
> This is not some kind of special property implementation. n is a struct.  
> It has no data and therefore is a very peculiar kind of struct. A struct  
> with no data needs only one instance, ever. Copying it is pointless.  
> Taking its address is pointless. Creating a new instance is pointless.  
> Passing it by ref is pointless. All operations which require more than  
> one instance are pointless, which is why it doesn't need a separately  
> defined type. The type and the instance can therefore use the same name,  
> n in this case.

No, the struct must have data.  If it doesn't, how does it get back to the  
owner type?  In other words, your n struct must have a pointer to the  
myStruct instance it intends to modify _n on.

Unless, of course, you pass the pointer to myStruct as the 'this'  
reference.  But then, this isn't a normal struct, and I'm really failing  
to see why we have to make this a struct at all.

> Note that n uses the new rule which allows it access to its parent's  
> scope, the same way it would in a nested function. The only pointer it  
> needs is the same pointer used for myStruct, since myStruct actually  
> stores some data.

FYI, nested structs in functions (the ones you want to use as a model)  
have an extra hidden reference pointer back to the stack frame data.  That  
is how they can access the local variables of the function.

This proposal looks way too complicated.  I don't see how it's a win over  
the current state of affairs, or even the @property implementation we  
expected to get but didn't.  You need to solve the "owner pointer" problem  
before it's even viable.

-Steve


More information about the Digitalmars-d mailing list