On 11/10/2013 12:35 PM, Kenji Hara wrote:
2013/11/10 Timon Gehr <timon.g...@gmx.ch <mailto:timon.g...@gmx.ch>>
...

      = Do you think that in this case one should implement identical
        mutable and immutable postblit?


I think yes.


This still leaves the issue outlined in the other post though. How to copy inout to inout?

      = "Pure function call which returns unique object"
        -> "Strongly pure ..."


This is valid. Because not only strongly pure function will return
unique object.
...

inout(int[]) identity(inout(int[]) x)pure{ return x; }

struct S{
    int[] arr;
    this(this)inout{
        arr = identity(arr); // whoops
    }
}

But you are right, strongly pure is the wrong term. It is 'pure with unique arguments'.

For example:
   immutable(int)[] foo(int[] iarr) pure { ... }
   int[] marr = foo([1,2,3]);
   // foo will never return the arr argument (without unsafe cast).

      = "New expression with unique arguments"
        -> "Pure new expression ..."


I'm not sure that "pure new expression" is widely used word in D...

"New expression using a pure-qualified constructor with unique arguments."


      = (Also, the inadequacy of 'inout' becomes painfully obvious: Clearly,
        we'd want 'inout' to mean something different for the source and
        target struct instances. Then the definition of what is unique
        would not be necessary in this DIP. (Anything that converts to inout
        would be fine anyway.))


As I already answered to deadalnix,  it is strongly related to inout.
To describe about that, I added a section "Why use 'inout' keyword for
'unique' postblit?" in DIP.

Kenji Hara

Sure, this makes sense to me. What I was referring to is the following hypothetical design, that allows multiple different inout-qualifiers, for example denoted by inout/n, where n is some integral constant:


inout(int[]) identity(inout(int[]) x){
    writeln("foo"); // not pure
    return x;
}

struct S{
    int[] a;
    int[] b;
    int[] c;
    int[] d;
    this(inout/1 this)inout/2{
        static assert(is(typeof(a)==inout/1(int[])));
        a = b; // error: b of type inout/1(int[]) is not
               // implicitly convertible to inout/2(int[])
        b = somePureFunction(new int[] a);  // ok
        c = identity(new inout/2(int)[] a); // ok, even though identity
                                            // _not pure_
        // error: d has not been reassigned
    }
}





Reply via email to