On 2009-07-25 08:07:56 -0400, KennyTM~ <kenn...@gmail.com> said:

Michel Fortin wrote:

In the other thread, I suggested this, which could aleviate the problem:

    int foo.opGet();        // getter
    void foo.opAssign(int); // setter

with some support from the compiler.

It could even be exteded to support more:

    int foo.opIndex(int); // foo[1];
    void foo.opAddAssign(int); / foo += 1;
    void foo.invert(); // special function attached to property

Basically, all you need to implement properties is not a dedicaced "property" syntax, it's a syntax to implement some kind of local namespace, and am "opGet" or "opValue" operator for representing the local namespace. It could also be expressed like this:

    namespace foo {
        int opGet(); // getter
        void opAssign(int); // setter
        ...
        int opIndex(int); // foo[1];
        void opAddAssign(int); / foo += 1;
        void invert(); // special function attached to property
    }

In both cases, the result would be the same:

    foo = 1; // same as foo.opAssign(1);
    return foo; // same as return foo.opGet();


If property is going to be extended like this, why not just make a nested struct. Works even now.

Close, but a nested struct doesn't have access to the outer class, nor can you override its functions in a derived class. I'd say what I'm proposing is closer to a named mixin:

        class Z
        {
                int x;

                template Property()
                {
                        void opAssign(int v) { x = v; }
                        void opAddAssign(int v) { x += v; }
                        int get() { return x; }

                        alias get this;
                }
                mixin Property property;
        }

        Z z = new Z;
        z.property = 1; // works!

What doesn't work here is the "alias get this" line: you're still forced to explicitly call the getter. And I have the feeling that overriding in a derived class won't work either.

Oh and the syntax isn't great at all.

--
Michel Fortin
michel.for...@michelf.com
http://michelf.com/

Reply via email to