On Monday, 27 August 2012 at 11:15:36 UTC, Chris Nicholson-Sauls wrote:
Before we go proposing something like replacing 'new Foo( val )' with 'Foo.new( val )' ... which is just so Ruby-esque, but that's okay with me ... we need to consider that 'new' is not used only for classes. Okay, so presumably structs would work the same way, but what of, say, arrays? What would be the equivalent of 'new int[][]( 5, 10 )' given such a change?

As it stands, 'new' behaves like an operator (behaves like, but is really a grammar artifact) and so is consistent with intuition. How would we make something like 'int[][].new( 5, 10 )' make sense *without* having to provide a function (presumably through UFCS) for each arity? And, given the design of D arrays, what would such a function even look like?

idk, I think the int[][].new(5, 10) syntax looks good, and is consistent with how I described template parameters. Constructors would have completely arbitrary names. So, while a most would follow a naming standard (like 'new'), arrays could always use something that was a bit more descriptive, like 'alloc':

    struct Point(T)
    {
        T x, y;
        this new(T x, T y) { ... }
    }

    void main()
    {
        // create Point
        auto p = Point(int).new(1, 2);

        // create dynamic array of 5 Points
        // and construct them all
        auto a = Point(int)[].alloc(5);
        a[].new(1, 2);

        // shorthand equivalent
        auto a = Point(int)[].alloc(5).new(1, 2);

        // same thing, but with static array
        auto a = Point(int)[5].new(1, 2);
    }

Personally, I kinda think using 'new' instead of 'alloc' makes more sense, for consistency reasons:

    auto a = Point(int)[].new(5).new(1, 2);

but then, I can see why someone would want the distinction so it's easier to understand what constructor belongs to the Array.

Either way, I don't see any conflicts with the syntax I purposed.

Reply via email to