<html><head><meta http-equiv="Content-Type" content="text/html charset=utf-8"></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class=""><br class=""><div><blockquote type="cite" class=""><div class="">On Jan 4, 2016, at 11:31 PM, Howard Lovatt &lt;<a href="mailto:howard.lovatt@gmail.com" class="">howard.lovatt@gmail.com</a>&gt; wrote:</div><br class="Apple-interchange-newline"><div class="">I&nbsp;was guessing that the current proposal does not change anything re. default and current member wise initializers and&nbsp;so in addition to suggesting Scala syntax I was also suggesting the transformation shown, or its equivalent. The advantage of having a member wise init that has default arguments and argument&nbsp;labels are considerable:<div class=""><br class=""></div><div class="">1. Allows lets as well as vars&nbsp;</div></div></blockquote><div><br class=""></div><div>The proposal does allow lets as well as vars. &nbsp;It is very unfortunate that defaults for lets cannot be supported immediately. &nbsp;Doing that is a highly desired enhancement. &nbsp;If you read Chris Lattner’s comments in the history of this thread you will have more background on the issues involved.</div><br class=""><blockquote type="cite" class=""><div class=""><div class="">2. Allows partial custom initialization&nbsp;</div></div></blockquote><div><br class=""></div><div>I don’t know for sure what you mean by this but the proposal does allow partial custom initialization in the way I think of that phrase.</div><br class=""><blockquote type="cite" class=""><div class=""><div class="">3. Eliminates need for other mechanisms, i.e. default and existing member wise initialization&nbsp;&nbsp;</div><div class=""><br class=""></div><div class="">These facilities could be added to `memberwise init(...)` as well. In particular, if a member wise init was present then an initialized property could have a label, e.g.:</div></div></blockquote><div><br class=""></div><div>I do not think allowing custom labels for memberwise initialization parameters is a good idea. &nbsp;The caller is initializing a member directly. &nbsp;It is more clear if the name of the parameter matches the name of the parameter.</div><br class=""><blockquote type="cite" class=""><div class=""><div class=""><br class=""></div><div class="">&nbsp; &nbsp; &nbsp;class C {</div><div class="">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;let example name: Type = initial</div><div class="">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;memberwise init(...)</div><div class="">&nbsp; &nbsp; &nbsp;}</div><div class=""><br class=""></div><div class="">Would become the equivalent of:</div><div class=""><br class=""></div><div class="">&nbsp; &nbsp;&nbsp;<font size="2" class=""><span style="background-color:rgba(255,255,255,0)" class="">&nbsp;class C {</span></font></div><div class=""><font size="2" class=""><span style="background-color:rgba(255,255,255,0)" class="">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;let name: Type</span></font></div><div class=""><font size="2" class=""><span style="background-color:rgba(255,255,255,0)" class="">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;init(</span></font><span style="background-color:rgba(255,255,255,0);font-size:small" class="">example name: Type = initial) {</span></div><div class=""><span style="background-color:rgba(255,255,255,0);font-size:small" class="">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<a href="http://self.name/" class="">self.name</a> = name</span></div><div class=""><span style="background-color:rgba(255,255,255,0);font-size:small" class="">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;}</span></div><div class=""><font size="2" class=""><span style="background-color:rgba(255,255,255,0)" class="">&nbsp; &nbsp; &nbsp; }</span></font></div><div class=""><br class=""></div><div class="">The Scala syntax is just a shorter alternative, ideally there&nbsp;be a discussion of the pros and cons of the two syntax that included the possibility of the wider set of objectives as outlined in the numbered points above.</div></div></blockquote><div><br class=""></div><div>It was not a goal of this proposal to provide the most concise syntax for simple cases. &nbsp;The goal of this proposal is to provide a flexible and scalable memberwise initialization facility. &nbsp;Specific goals included supporting more than one memberwise initializer as well as allowing some properties to be memberwise initialized and some (private state, etc) to be initialized by other means.</div><div><br class=""></div><div>An independent proposal focused on making simple cases as concise as possible is something that could also be pursued.</div><br class=""><blockquote type="cite" class=""><div class=""><div class=""><br class="">On Tuesday, 5 January 2016, Matthew Johnson &lt;<a href="mailto:matthew@anandabits.com" class="">matthew@anandabits.com</a>&gt; wrote:<br class=""><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div style="word-wrap:break-word" class=""><br class=""><div class=""><blockquote type="cite" class=""><div class="">On Jan 4, 2016, at 5:48 PM, Howard Lovatt &lt;<a href="javascript:_e(%7B%7D,'cvml','howard.lovatt@gmail.com');" target="_blank" class="">howard.lovatt@gmail.com</a>&gt; wrote:</div><br class=""><div class=""><div style="word-wrap:break-word" class="">Yes you can get close, but:<div class=""><br class=""></div><div class="">1. Its weird that you can only do this in an extension.</div></div></div></blockquote><div class=""><br class=""></div><div class="">This is the way the current implicit initializer works.&nbsp; It is not synthesized if you define any initializers in the body of the type.&nbsp; There are good reasons it works this way and the current proposal does not change those rules.</div><br class=""><blockquote type="cite" class=""><div class=""><div style="word-wrap:break-word" class=""><div class="">2. Its not quite the same as the proposal the current member-wise initialiser does not make the init arguments optional (the arguments themselves do not have defaults), i.e. with your example `let defaultOriginRect = Rect(size: Size(width: 5.0, height: 5.0))` fails whereas it would work for the proposal (this could also be true if the existing struct memberwise init and the new `memberwise init(..)` where changed to provide init argument defaults).</div></div></div></blockquote><div class=""><br class=""></div><div class="">The implicit memberwise initializer currently in the language does not provide defaults for parameters.&nbsp; This proposal changes that behavior and provides defaults if the the member is a `var` and has an initial value. &nbsp;</div><div class=""><br class=""></div><div class="">Unfortunately I was not able to find a solution to allow synthesized parameters for `let` members to have default values.&nbsp; This is because the current semantics for `let` members do not allow the member to be initialized to anything other than the initial value if one is provided.&nbsp; I am hoping a solution to this will be identified in the future and have suggested one possible mechanism `@default` in the future enhancements section.</div><br class=""><blockquote type="cite" class=""><div class=""><div style="word-wrap:break-word" class=""><div class="">3. Only ‘really' works for structs, the compiler doesn’t write a member-wise initialiser for classes (just a default initializer).</div></div></div></blockquote><div class=""><br class=""></div><div class="">That is true about the current behavior of the language but is not true with regards to the current proposal.</div><br class=""><blockquote type="cite" class=""><div class=""><div style="word-wrap:break-word" class=""><div class="">4. Still need the compiler to provide both default and member-wise initialisers, whereas this proposal would allow the existing&nbsp;default and member-wise initialisers to be deprecated and just the new member-wise initialiser would remain which would simplify the language and make it clear what was happening (this could also be true if a `memberwise init(..)` where added and existing compiler written inits removed).<br class=""></div></div></div></blockquote><div class=""><br class=""></div><div class="">This proposal does not change anything with regard to the default initializer.</div><br class=""><blockquote type="cite" class=""><div class=""><div style="word-wrap:break-word" class=""><div class=""><div class=""><br class="">

</div>
<br class=""><div class=""><blockquote type="cite" class=""><div class="">On 5 Jan 2016, at 10:16 AM, Matthew Johnson &lt;<a href="javascript:_e(%7B%7D,'cvml','matthew@anandabits.com');" target="_blank" class="">matthew@anandabits.com</a>&gt; wrote:</div><br class=""><div class=""><div style="font-family:Helvetica;font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px" class="">struct Rect { var origin: Point = Point(), size: Size = Size() }</div><div style="font-family:Helvetica;font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px" class="">extension Rect {</div><div style="font-family:Helvetica;font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px" class="">&nbsp; &nbsp; &nbsp; &nbsp;init(center: Point, size: Size) {<br class=""><blockquote type="cite" class=""></blockquote>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;let originX = center.x - (size.width / 2)<br class=""><blockquote type="cite" class=""></blockquote>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;let originY = center.y - (size.height / 2)<br class=""><blockquote type="cite" class=""></blockquote>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;self.init(origin: Point(x: originX, y: originY), size: size)<br class=""><blockquote type="cite" class=""></blockquote>&nbsp; &nbsp; &nbsp; &nbsp;}</div><div style="font-family:Helvetica;font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px" class="">}</div></div></blockquote></div><br class=""></div></div></div></blockquote></div><br class=""></div></blockquote></div><br class=""><br class="">-- <br class="">&nbsp; -- Howard.<br class=""><br class="">
</div></blockquote></div><br class=""></body></html>