Possible @property compromise

Zach the Mystic reachBUTMINUSTHISzach at gOOGLYmail.com
Fri Feb 1 19:50:48 PST 2013


On Saturday, 2 February 2013 at 03:14:30 UTC, Zach the Mystic 
wrote:
> On Friday, 1 February 2013 at 21:33:31 UTC, Rob T wrote:
>> It's one thing to implement a struct, and another thing to 
>> implement nested structs that can refer to the host instance. 
>> I know some people want nested structs that can work in that 
>> way, but implementation is problematic because when the host 
>> struct is moved, then the nested struct has to move along with 
>> it and this one reason why we don't have them.
>
> I am not proposing this and I don't think it's actually 
> necessary. My nested struct is just a tried-and-true struct. So 
> what's the difference? How does it still succeed? Not because 
> it contains any special data or hidden pointers unto itself. 
> Rather, because its *functions* are written to *accept hidden 
> pointers*. That way they can operate on whatever instance of 
> their parent's type gets sent to them. They could be optimized, 
> in theory, to only accept pointers to instances they actually 
> worked on. For example, if a nested member function did nothing 
> but set an integer defined in a struct three nests up, it only 
> need take an instance of that struct, but that's an advanced 
> optimization, not necessary for a basic implementation which 
> would simply pass three pointers to every three-deep nested 
> struct member function. If you want an example, just ask.

I mean a code example. But since I'm already here:

struct A
{
   int _a = 1;
   B b;
   struct B
   {
     int _b = 1;
     C c;
     struct C
     {
       int_c = 1;
       int myMemberFunction() { return _a + _b + _c; }
     }
   }
}

How does myMemberFunction know about _a and _b? Because its 
implementation is actually:

int myMemberFunction(ref A __a, ref A.B __b, ref A.B.C __c) { 
return __a._a + __b._b + __c._c; }

I do find it frustrating that his kind of thing is necessary to 
get full compatibility between structs and properties, which 
would be so elegant.

Usage would be:

A a;
assert(a.b.c.myMemberFunction() == 3);

...which is secretly translated to this:

assert(A.B.C.myMemberFunction(a, a.b, a.b.c) == 3);


More information about the Digitalmars-d mailing list