RFC: naming for FrontTransversal and Transversal ranges
Robert Jacques
sandford at jhu.edu
Fri May 1 10:44:58 PDT 2009
On Fri, 01 May 2009 06:26:19 -0400, Michel Fortin
<michel.fortin at michelf.com> wrote:
> On 2009-04-30 15:57:17 -0400, Andrei Alexandrescu
> <SeeWebsiteForEmail at erdani.org> said:
>
>> 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.
>
> I think D slices are a good concept for pointers to a fixed-size array.
> If you write new int[4], you're creating a fixed-size array of four
> ints, and getting a slice to the whole. If you concatenate it with some
> other array, it creates a new one.
>
> As you like to point out, the fun starts when you have arrays of mutable
> elements and want to resize them. If you have an array of four elements
> and write array.length = 5, then you're perhaps creating a new one,
> disconnected from the previous one, and perhaps not. This pose no
> problem if your slice is the only one pointing to the memory block,
> otherwise the results are rather unpredictable.
>
> Well, containers are no better at that. If you have some slices of a
> container and you grow the container you may or may not disconnect all
> your slices (unless you're creating an indirect slice as {container*,
> int start, int end} or course).
>
> Which makes me think that perhaps we could introduce a unique type
> attribute and just forbid growing dynamic arrays unless they are flagged
> as unique. That'd make "unique T[]" behave as the container and "T[]" as
> the slice. And perhaps we could build that on top of the concept of
> uniqueness Bartosz wants to be expressible in D for the concurrency
> model, as he said in his latest post:
>
>> In traditional type systems there is no way to express the requirement
>> that a message passed by reference must either be a monitor itself or
>> behave like a C++ unique_ptr (an object that leaves no aliases behind).
>> This requirement should be expressible in D, allowing the compiler to
>> check for its violations.
>
> <http://bartoszmilewski.wordpress.com/2009/04/26/multithreading-with-d/>
>
I think you might of misunderstood the concept of a unique/mobile type. If
you take a slice or a reference of an unique, you null the source. Which
makes using unique T logically invalid as a container. Also, shared unique
T can't be converted to shared T. This incompatibility is the whole point
of having a unique type in the first place, and negates your concept of
using unique T as containers. And generally, unique T implies shared
storage, and can not be used for thread-local arrays.
Lastly, what you're trying to fix is a bug in the implementation of arrays
(see my posts in this thread) and not a bug in the design.
More information about the Digitalmars-d
mailing list