On Saturday, 2 February 2013 at 13:03:49 UTC, Era Scarecrow wrote:
 First impression: I don't know why but I don't like it.

 It feels like you're doing the following:

1) Declare a struct and immediately instantiate it with the same name. (Or union, or similar) 2) Only one declaration of this struct can exist, doesn't count as nested struct.
 3) Disable all constructors/postblit/opAssign except as follows

 [..]

Memberspaces shouldn't feel like variables at all. They should feel exactly like C++ namespaces that live inside a struct or a class. You can't take the address of a namespace or pass it as an argument. It's just an identifier that can be used to separate two same names, like std::sort and boost::sort. A nice IDE also colors memberspaces differently from a variables, etc.

On Saturday, 2 February 2013 at 13:03:49 UTC, Era Scarecrow wrote:
 [..]
The only thing it has really done is allow you to force the use of parenthesis during a call (but only the get, not the set).

I thought it was an unfortunate side-effect that my proposal doesn't give us the nice getter syntax:
int n = var.prop;
...but I'm glad you like it (if I understood correctly).

On Saturday, 2 February 2013 at 13:03:49 UTC, Era Scarecrow wrote:
[..]
You're then defining all opBinary/opAssign methods that it works with which seems like it will end up bloating the code considerably but not giving back as much as it takes to write it.

But luckily in D you can write a whole bunch of operators at once by writing a restricted template operator, like:

void opOpAssign(string op)(int rhs)
    if(op == "+" || op == "-" || op == "*"  || op == "/")
{
    mixin("_value" ~ op ~ "= rhs._value");
}

But you're right in that memberspaces require a more explicit declaration of a property than most other property implementations. But those property proposals where you only specify a getter and a setter, albeit faster to write, they all suffer from a possible performance issue when the type returned by getter is non-trivial to copy. I.e.
var.prop += 3;
...has to be done as:
var.prop = var.prop + 3

Also, those other property implementations don't enable you to call the methods of your property in an encapsulated manner. E.g. if you property has a non-const set_to_invalid method, you can't encapsulate further in the struct/class where the property is defined. I.e:
var.prop.set_to_invalid();
...calls directly PropType.set_to_invalid without the type of 'var' having anything to say about it. That's not good for encapsulation.

Reply via email to