Using pure to create immutable

Jonathan M Davis jmdavisProg at gmx.com
Thu Sep 22 12:44:21 PDT 2011


On Thursday, September 22, 2011 23:36:40 Dmitry Olshansky wrote:
> On 22.09.2011 22:53, Jesse Phillips wrote:
> > The discussion on Reddit brought to my attention that pure functions can
> > return and assign to an immutable.
> > 
> > http://www.reddit.com/r/programming/comments/knn5p/thoughts_on_immutabil
> > ity_in_d/c2lsgek
> > 
> > I am trying to modify the example request to make use of this, but have
> > failed.
> > 
> > http://www.reddit.com/r/programming/comments/knn5p/thoughts_on_immutabil
> > ity_in_d/c2lrfpm
> > 
> > test.d(4): Error: cannot implicitly convert expression
> > (makeFromArray([1,2,3])) of type test.List!(int).List to
> > immutable(List)
> > 
> > Is this a bug? I can't identify where this issue would lie (works with
> > inheritance and templating).
> Maybe:
> -------------------------<<<<<<<<<<
>   List!T makeFromArray(T)(immutable T[] array) pure {
> 
> >     if (array.length == 0) { return null; }
> >     
> >     auto result = new Cons!T(array[0], null);
> >     auto end = result;
> >     
> >     for (int i = 1; i<  array.length; ++i) {
> >     
> >        end.tail_ = new Cons!T(array[i], null);
> >        end = end.tail_;
> >     
> >     }
> >     
> >     return result;
> > 
> > }
> 
> If I'm not mistaken only strongly pure functions are working.h

Which would make sense. The only reason that it can implicitly cast to 
immutable is because it _knows_ that there are no other mutable references to 
that data, and for it to be able to know that, the function must be strongly 
pure.

- Jonathan M Davis


More information about the Digitalmars-d-learn mailing list