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.