On Thu, 22 Sep 2011 15:44:21 -0400, Jonathan M Davis <[email protected]> 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

Reply via email to