std.experimental.collection.functional.slist

ZombineDev via Digitalmars-d digitalmars-d at puremagic.com
Thu Jun 18 20:10:33 PDT 2015


On Friday, 19 June 2015 at 02:24:35 UTC, Andrei Alexandrescu 
wrote:
> On 6/18/15 6:26 PM, ZombineDev wrote:
>> On Friday, 19 June 2015 at 01:07:10 UTC, ZombineDev wrote:
>>> On Thursday, 18 June 2015 at 23:32:03 UTC, Andrei 
>>> Alexandrescu wrote:
>>> [..]
>
> Yah, traditionally functional data structures don't allow their 
> clients to mutate the data AND the topology of the container. 
> So front() returns a non-mutable ref.
>
> It might be interesting to explore containers that allow 
> mutation of data but not of topology. We may collectively think 
> of a few applications of that. For now I went the traditional 
> route.
>
>
> Andrei

I just realized that my idea of something in between collections 
and ranges obviously comes from D's own slices/dynamic arrays :D 
(I really shouldn't be allowed to talk so late in the night :D)

So here's an idea - can we make the new functional SList (and 
probably DList) the logic counter-part of slices?

const SList!int;    // <- `const int[]` You can't mutate the 
elements,
                     // nor the topology

SList!(const(int)); // <- `const(int)[]` You can mutate the 
topology,
                     //but not the elements

ConstSList!(int);   // <- `missing head const array` You can 
mutate the elements,
                     // but not the topology

SList!(int);        // <- `int[]` Unlimited power

SList!(int) mutable_list;
mutable_list ~= 3; //change the topology in-place

const SList!(int) const_list;
const_list ~= 42; //error - can't mutate const SList
const SList!(int) concat_result = const_list ~ 42; 
//functional-style "modification"
foreach (elem; concat_result) {..} //error need mutable range, 
because of popFront()

SList!(const(int)) range = concat_result; // implicitly 
convertable
                                           // like const(int)[] <- 
const(int[])
foreach (elem; range) {..} // works


So instead of limiting the user by making `front` return const 
refs, we allow him to choose.


More information about the Digitalmars-d mailing list