On Saturday, 7 September 2013 at 23:22:59 UTC, Dmitry Olshansky wrote:
08-Sep-2013 02:57, Xinok пишет:
For me, one of the annoyances of working with immutable data is simply initializing data. Immutable variables have to be initialized upon declaration and cannot be modified after that point. This is made more difficult if you have several immutable variables to initialize in
conjunction with one another

[snip]


An impractical example:

void foo()
{
    immutable
    {
        int[] arr = ...;
        int[] arr2 = arr.dup;
        sort(arr); // arr is still mutable

        int[] arr2 = arr.dup;
        reverse(arr2);
        arr ~= arr2;
    }

    sort(arr); // Error is thrown because arr is now immutable
}

A pure lambda can achieve the same unless, of course, purity is out of question:
    immutable arr = {
        int[] arr = ...;
        int[] arr2 = arr.dup;
        sort(arr); // arr is still mutable

        int[] arr2 = arr.dup;
        reverse(arr2);
        arr ~= arr2;
        return arr;
    } pure ();

Both arr and arr2 would exist as immutable arrays outside of that scope. That's what I meant by, nested functions could only initialize one immutable variable at a time, because you can only return one value to initialize the immutable variable with. With immutable blocks, you can initialize several immutable variables simultaneously.

Basically even not yet completely outlined the feature already pulls in escape analysis. Not going to fly IMHO.

They follow the same rules as pure functions. They can only access immutable data, can only call pure functions, etc. No need for escape analysis, no need to reinvent the wheel. Furthermore, if the capabilities of pure functions is extended, so is the capabilities of immutable blocks.

Reply via email to