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