Using pure to create immutable

Steven Schveighoffer schveiguy at yahoo.com
Thu Sep 22 13:09:29 PDT 2011


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.

-Steve


More information about the Digitalmars-d-learn mailing list