<!DOCTYPE html>
<html>
<head>
<title></title>
</head>
<body><div>This is great news! Thank you for being willing to reconsider this proposal. And the explanation given in this email is really great. Even though I stated earlier that ditching `var` in parameter lists is mildly annoying, the rationale given here is very compelling. And the reasons for keeping "var" everywhere else are spot-on too.<br></div>
<div>&nbsp;</div>
<div>-Kevin Ballard<br></div>
<div>&nbsp;</div>
<div>On Thu, Jan 28, 2016, at 09:41 PM, Chris Lattner via swift-evolution wrote:<br></div>
<blockquote type="cite"><div>The core team met to discuss SE-0003, and we have a new conclusion, described below. &nbsp;As was mentioned on the other thread, this proposal is a bit unusual because it predates Swift open source, and thus didn’t go through the full evolution process, nor did it get the normal public review that would come with it.<br></div>
<div><div>&nbsp;</div>
<div>&nbsp;</div>
</div>
<div>The core team broke this proposal down into a few different cases, each of which came to a different conclusion. &nbsp;To be clear up front, this is not a clear-cut topic, and there are opinions on all sides. &nbsp;Here are the decisions the core team came to, along with some rationale:<br></div>
<div>&nbsp;</div>
<div>&nbsp;</div>
<div><b>Parameter Lists</b><br></div>
<div>&nbsp;</div>
<div>‘var’ in a parameter list is problematic for a number of reasons:<br></div>
<div>&nbsp;</div>
<div>- Parameter lists currently allow both “inout” and “var”, and real confusion occurs for some people learning swift that expect “var” to provide reference semantics.<br></div>
<div>&nbsp;</div>
<div>- Parameter lists are not “patterns” in the language, so neither “let” nor “var” really make sense there. &nbsp;Parameters were patterns in a much older swift design, but that was eliminated a long time ago and this aspect never got reconsidered.<br></div>
<div>&nbsp;</div>
<div>- “var” in a parameter list is odd because it is an implementation detail being foisted on the interface to the function. &nbsp;To be fair, we already have this with "API names" vs "internal names”, but this is a bigger semantic implementation detail.<br></div>
<div>&nbsp;</div>
<div>&nbsp;</div>
<div>Conclusion: The core team decided that we should REMOVE “var” and “let” from parameter lists.<br></div>
<div>&nbsp;</div>
<div><div>“var” in a parameter list is convenient sugar that defines away some minor boilerplate (the shadowing copy), however, the cost benefit tradeoff doesn’t pay enough to keep it.<br></div>
</div>
<div>&nbsp;</div>
<div>&nbsp;</div>
<div><b>Patterns</b><br></div>
<div>&nbsp;</div>
<div>"if var”, “for var”, "if case var" etc all use the pattern grammar (aka "pattern matching" and “destructuring” features described in TSPL). &nbsp;We discussed whether to eliminate var from this, with much more mixed results:<br></div>
<div>&nbsp;</div>
<div>- We currently have a duality across the language between var and let which is common, unifying, and works really well in practice. &nbsp;Eliminating var from pattern matching would make the language less uniform, because patterns wouldn’t align with var/let declarations.<br></div>
<div>&nbsp;</div>
<div>- Working in Swift *demands* that you get an early grasp on what value semantics means, and “var x = y” is always a copy of the value. &nbsp;As such, based on the strong duality mentioned above, it is reasonable to expect people to learn that “if var x = y” produces a copy and not a reference binding.<br></div>
<div>&nbsp;</div>
<div>- There certainly is confusion from people who expect “if var” to do a reference binding, despite the comment directly above. &nbsp;However, we feel that this is more of a point-in-time confusion than the parameter case, given that the parameter case exposes the ‘var’ as part of the function signature.<br></div>
<div>&nbsp;</div>
<div>&nbsp;</div>
<div><div>Conclusion: The core team decided that we should KEEP “var” and “let” in patterns.<br></div>
</div>
<div>&nbsp;</div>
<div>&nbsp;</div>
<div><b>Case Patterns</b><br></div>
<div>&nbsp;</div>
<div>We had an additional discussion focused specifically on whether it would make sense to ban var in case patterns, e.g.:<br></div>
<div><span style="white-space:pre;"></span>case .Foo(var x):<br></div>
<div>&nbsp;</div>
<div>- The core team agrees that this specific case is a common point of confusion, particularly because Swift doesn’t provide a way to get a mutable binding to the associated value in an enum.<br></div>
<div>&nbsp;</div>
<div>- That said, making a special case for this would make Swift less regular.<br></div>
<div>&nbsp;</div>
<div>&nbsp;</div>
<div>Conclusions:&nbsp;<br></div>
<div>- The core team decided to KEEP “var” here.<br></div>
<div>- We will stop leading people into it by eliminating the "note: change 'let' to 'var' to make it mutable” note that the compiler produces for patterns.<br></div>
<div>&nbsp;</div>
<div>Eliminating the note allows users sufficiently knowledgable about Swift to keep using it, but people who just mash the “fixit” button to silence the compiler won’t get surprising behavior.<br></div>
<div>&nbsp;</div>
<div>-Swift Core Team<br></div>
<div>&nbsp;</div>
<div>&nbsp;</div>
<div><u>_______________________________________________</u><br></div>
<div>swift-evolution mailing list<br></div>
<div><a href="mailto:swift-evolution@swift.org">swift-evolution@swift.org</a><br></div>
<div><a href="https://lists.swift.org/mailman/listinfo/swift-evolution">https://lists.swift.org/mailman/listinfo/swift-evolution</a><br></div>
</blockquote><div>&nbsp;</div>
</body>
</html>