D has a number of subtle problems (performance and semantic) that arise
when arrays are resized. The solution is to separate resizeable array
types from slices. Slices will retain the old:
T[] slice;
syntax. Resizeable arrays will be declared as:
T[new] array;
The new expression:
new T[10]
will return a T[new].
T[new] will implicitly convert to T[], but not the other way.
slice.length will become read-only.
Under the hood, a T[new] will be a single pointer to a library defined
type. This library defined type will likely contain three properties:
size_t length;
T* ptr;
size_t capacity;
The usual array operations will work on T[new] as well as T[].
Doing this change will:
1. fix many nasties at the edges of array semantics
2. make arrays implementable on .net
3. make clear in function signatures if the function can resize the
array or not