Denis Koroskin wrote:
On Thu, 01 Oct 2009 20:25:03 +0400, Andrei Alexandrescu
<[email protected]> wrote:
[...]
What do you think?


Andrei

This is cool. I'd also add Serialization task to the application list (currently I manually insert "mixin Serializable!();" into every class.

Yah, serialization is close to reflection so it's definitely part of the target applications of the features.

There is one thing that I dislike about it, though. I believe mixin(Foo) {} syntax is a bit far-fetched, it is not obvious that Foo represents derived type inside a mixin scope.

I'd like to remind you that we could just use typeof(this) instead of Foo/Derived/etc:

static if (is (typeof(this) == Counted) {
    ref uint getCounter() { return counter; }
} else {
    override ref uint getCounter() { return counter; }
}

Yah, I thought a lot along the likes of typeof(this). We need some symbolic alias for "the struct or class currently being defined" and typeof(this) is an obvious choice. I just fear that it might be confusing that typeof(this) works even outside any method, i.e. when there is no "this".

If you remember, we had a similar discussion about a half year ago. It was about ICloneable interface that forces all derived class to implement proper clone() method. We could define it as:

// forces implementor class and all the derivatives to implement proper clone() method
interface ICloneable
{
    scope mixin {    // alternative syntax
        typeof(this) clone();
    }
}

Yah, I remember.

and also be able to declare a method non-recursively (so that derived class don't have to implement that method):

interface ICloneableNonRecursive
{
    typeof(this) clone();
}

Other possible solution could be to use a special "derived" keyword. We already have a class-level compile-time constant - "super". We could also introduce its counter-part ("derived"), which will expand into a concrete derived class type. This will simplify the syntax a bit and will allow to get rid of mixin and an addition level of indentation:

interface ICloneable
{
    derived clone();
}

interface IComparable
{
    int opCmp(derived other);
}

As a downside, I don't know how to define a field in every class this way ("int derived.counter;" maybe?).

I dislike adding yet another keyword. In fact, I want to propose Walter to eliminate "super" as a keyword and make it just an alias for the base class as if you defined it by hand.


Andrei

Reply via email to