<div dir="ltr">2013/11/10 deadalnix <span dir="ltr"><<a href="mailto:deadalnix@gmail.com" target="_blank">deadalnix@gmail.com</a>></span><br><div class="gmail_extra"><div class="gmail_quote"><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">
<div class=""><div class="h5"><span style="color:rgb(34,34,34)">I like it up to the unique part. For mutable/const/immutable postblit, I do think this is it, you nailed it perfectly.</span></div></div></blockquote><div><br>
</div><div>Thans for the comment, @deadlnix.</div><div><br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">
For the unique part, this become tricky, as we do not specify what is a unique expression. For this, I do not think that overloading inout make too much sense. inout already mean something else, and uniqueness is generally a useful concept that is not reserved to postblit. In fact, to make the unique posblit work, it is required that we define unique expression, and that is way beyond the scope of this DIP.<br>
</blockquote><div><br></div><div>The unique expression concept is not a trick. It already exists in D.</div><div><br></div><div>Currently sometimes you can qualify returned objects from a pure function with arbitrary qualifier.</div>
<div><br></div><div>int[] foo(int n) pure { ... }</div><div>int[] marr = foo(1);</div><div>const int[] carr = foo(1);</div><div>immutable int[] iarr = foo(1);</div><div><br></div><div>The reason why it's possible is that the pure function call `foo(1)` makes unique expression.</div>
<div><br></div><div>Currently you can create arbitrary typed array object by using just only one syntax.</div><div><br></div><div>int[] marr = [1,2,3];</div><div>const int[] carr = [1,2,3];</div><div>immutable int[] iarr = [1,2,3];</div>
<div><br></div><div>The reason why it's possible is that the array literal makes unique expression.</div><div><br></div><div>So, the "unique expression" is the name for one another aspect of existing D concept.</div>
<div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">
Additionally, inout posblit make sense without changing the meaning of posblit, which make the proposal confusing.<br>
<br>
Let's make the posblit inout be what inout always has been : a wildcard for a qualifier in the callee that is known from the caller.<br>
</blockquote></div><br></div><div class="gmail_extra"><div class="gmail_extra">No, the unique postblit concept is strongly related to inout type qualifier.</div><div class="gmail_extra"><br></div><div class="gmail_extra">
Condider a case that copying "inout struct" inside inout function.</div><div class="gmail_extra"><br></div><div class="gmail_extra">struct S {</div><div class="gmail_extra">    int[] arr;</div><div class="gmail_extra">
    this(this) ??? { }</div><div class="gmail_extra">}</div><div class="gmail_extra">int[] foo(inout S src)</div><div class="gmail_extra">{</div><div class="gmail_extra">    S dst = src; // copy inout S to S</div><div class="gmail_extra">
    return dst.arr;</div><div class="gmail_extra">}</div><div class="gmail_extra"><br></div><div class="gmail_extra">If the struct S has postblit, what shold be done for "copying S from inout to mutable"?</div><div class="gmail_extra">
<br></div><div class="gmail_extra">1. You cannot modify elements of arr field, because originally it may be immutable.</div><div class="gmail_extra">2. You must re-initialize arr field by unique expression, otherwise it may break type system</div>
<div class="gmail_extra"><br></div><div class="gmail_extra">The requirements are exactly same as what necessary for unique postblit.</div><div class="gmail_extra">Essentially "creating unique copy" is exactly same as "treating the copy source as inout".</div>
<div><br></div><div>Kenji Hara</div></div></div>