On Thu, 30 Apr 2009 23:57:17 +0400, Andrei Alexandrescu 
<seewebsiteforem...@erdani.org> wrote:

Robert Jacques wrote:
On Wed, 29 Apr 2009 20:45:23 -0400, Andrei Alexandrescu <seewebsiteforem...@erdani.org> wrote:

It has become increasingly clear we'll need to support arrays in
addition to slices.
No, Andrei it hasn't. A detailed paragraph (or more) explaining we you think so should be included in the full RFC.

There are several converging pieces of evidence. Each can be debated in separation, yet together they make for a rather strong case.

People have complained about the incredibly bad, unsafe, and slow behavior of appending. Even before the considerable recent slowdown of ~=, there were speed concerns. Worse than that, the completely weird behavior of slices that grow to stomp on other slices cannot be defended.

The idiom:

array.length = n;
array.length = 0;
// append to array up to n...

is rather disingenuous and looks odd to the casual reader.

As predicted by the "range theory" which predicates that a range will never grow, only shrink, slices should always shrink. Growing is a foreign operation for a slice. This is a big problem that goes beyond a need for purity or cleanliness - it's just terrible to have a slice stomping around, and then uncontrollably being rebound elsewhere and so on. People pass slices into functions, functions modify them and also append to them, and depending on the phase of the moon, some updates are being seen in the caller.

So people have defined various types (such as ArrayCreator or ArrayAppender or whatnot) that take care of that aspect. But really what we're looking at is an Array type.

Another issue is that we can get (partly) away with disowned slices because of the garbage collector: whenever a slice is to be rebound, whatever chunk it was bound to is left behind and will be duly collected. If, however, we want to support other programming disciplines that exercise stricter control over memory, the "parent" arrays must become an explicit type that code can keep around and manipulate directly.

A design that has one container type and several slice types that crawl it in various ways is very compelling, and I think it will be a huge selling point for D. It would be odd, not natural, to have arrays as a singularly distinct container that is in fact its own range. We get away with container == range for arrays partly because arrays are a simple structure, but that only blurs thinking and understanding of more complex containers. In fact, ranges do predict that any attempt to grow a range will cause topological issues in the owning container; that's why SList wisely (IMHO :o)) includes a template parameter that tells whether its topology is fixed or flexible.

(Last but not least, .NET has arrays and slices. D's slices that actually have an array testis mesh real bad with .NET because in .NET you can't have a disowned slice.)


Andrei

I'm all for introducing Array type, but what would using it look like? Is it a 
plain Array!(T), or is there any shortcut planned. One of the selling points of 
slices is their ease of use. T[] is freaking awesome!

I also would like to see what would Phobos look like after introducing Arrays.

A good thing is that it's quite easy start implementing Array right now - all 
you need is to disallow ~ and ~= operations on slices. Then, go through Phobos 
code and see what got broken and start fixing it using newly written Array 
template (compiler doesn't have to know anything about it). I beleve it will 
become immediately clear whether D Arrays should be a reference or value type.

Reply via email to