Using pure to create immutable

Steven Schveighoffer schveiguy at yahoo.com
Thu Sep 22 13:11:05 PDT 2011


On Thu, 22 Sep 2011 16:09:29 -0400, Steven Schveighoffer  
<schveiguy at yahoo.com> wrote:

> On Thu, 22 Sep 2011 15:44:21 -0400, Jonathan M Davis  
> <jmdavisProg at gmx.com> wrote:
>
>> 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.
>
> Technically, something like this could be cast to immutable:
>
> T[] foo(const(T)[] arg) pure
>
> Since it can be proven that the result is new data.
>
> So it doesn't *need* to be strong-pure.

And actually, just making the argument immutable doesn't make it  
strong-pure, the result has to be too.

So I don't think it has to do with strong-purity at all.

-Steve


More information about the Digitalmars-d-learn mailing list