T[new] misgivings

Denis Koroskin 2korden at gmail.com
Fri Oct 16 07:53:04 PDT 2009


On Fri, 16 Oct 2009 18:30:24 +0400, Andrei Alexandrescu  
<SeeWebsiteForEmail at erdani.org> wrote:

> Lutger wrote:
>> Just to understand it:
>>  int[new] a;
>> int[new] b;
>>  a = [1,2,3];
>> b = a;
>>  In your book, the last statement would copy contents of a into b and  
>> b.ptr != a.ptr while according to walter, b would rebind to a?
>
> Well no.
>
> In the case above b would rebind to a, which is consistent with:
>
> int[new] a = [1, 2, 3];
> void fun(int[new] b) { ... }
> fun(a); // does not copy a
>
> I am not concerned about assigning one array to another. I'm more  
> concerned about assigning an array literal to an array.
>
>
> Andrei

So, the real question is, what's the type of an array literal?

If it's T[new] then you must reassign a reference to be consistent:

int[new] a = arrayLiteral;
int[new] b = a; // reassign reference
foo(arrayLiteral); // a reference passed

Else, invoke opAssign. And its semantics is not clear.

I'm in favor of removing hidden allocations and making compile-time  
literals immutable:

immutable(int)[] a1 = [1, 2, 3];

In case of compile-time literal assignment you can't just re-assign a  
reference (because it's immutable), so opAssign should take care of it:

int[new] a2;
a2 = [1, 2, 3]; // rewritten as a2.opAssign([1, 2, 3]);

Since there should be now hidden allocation, values should be overwritten.  
And there are two options:

1) Strict assignment:

# assert(a2.length == [1, 2, 3].length);
# a2[0..3] = [1, 2, 3];

2) Auto-expand (but not shrink!):

# if (a2.capacity > [1, 2, 3].length) throw new Exception("...");
# a2.capacity = [1, 2, 3].length;
# a2[0..3] = [1, 2, 3];

Why not shrink? Because I believe the following test should be valid:

a2 = [1, 2, 3];
assert(a2 == [1, 2, 3]); // they must match if the statement above succeeds



More information about the Digitalmars-d mailing list