On Thu, 15 Oct 2009 22:55:07 -0400, Andrei Alexandrescu <seewebsiteforem...@erdani.org> wrote:

I talked to Walter about T[new] today and it seems we are having a disagreement.

The problem is that I believe T[new] is a container, whereas Walter believes T[new] is nothing but a slice with a couple of extra operations.

Paradoxically this seems to be conducive to subtle efficiency issues. For example, consider:

int[new] a;
...
a = [1, 2, 3];

What should that do?

Walter: T[new] is a slice with benefits, assignment for slices rebinds the slice, therefore the assignment must do the same. In this case, the assignments allocate a new array and make a refer to that array. Whatever old array a referred to will continue to live wherever it was.

Me: T[new] is a container, therefore the assignment must resize the container from whatever size it had to 3 and then write 1, 2, 3 to its three slots.

I guess each of us has a point, but this is a setup for an increasingly unpleasant situation. Here's the dialog as it happened.

A: Ok, then how do I say the common operation "I want to overwrite whatever the array had with 1, 2, 3"? I can only presume there must be an obvious and simple way to do so, and I thought a = [1, 2, 3] was the obvious syntax to achieve that.

W: No, you must write

a[] = [1, 2, 3];

A: But that only works if the container already had length 3. So what I need to do is this:

a.length = 3;
a[] = [1, 2, 3];

A: But that is inefficient if the array had length less than 3 because it means double assignment

W: Nobody complained about it with slices.

A: So if I do want something that does the obvious operation "Whatever that array had, make it now have 1, 2, 3 as it contents" at a reasonable cost I need to call an elaborate function that is highly nontrivial to write?

W: Looks like so.

A: So then the first "Effective D" standard would have Item #1: "Avoid assignment to arrays. Call the assign() function"?

W: Nobody complained about it with slices.

===============

This goes into something more interesting that I thought of after the conversation. Consider:

T[new] a;
T[] b;
...
a = b;

What should that do?


Andrei

I like (and have used) the opSliceAssign syntax to represent by value/copy assignment as opposed to opAssign's by reference syntax. You could always define T[new] auto-resize in the case of a[] = b, but then you'd have to decide if that behavior should be extended to slices.

Reply via email to