<div dir="ltr">FWIW, I don&#39;t see any problems with the current &quot;if let x = ... &quot; syntax or behavior.  I view it as a mainstream language finally implementing anaphoric-if (as described in Paul Graham&#39;s _On Lisp_), and the unwrapping seems like a natural consequence of the semantics, because what else *could* it do?  The if-statement needs to test on something; it seems natural to me that the if tests for optional == nil, and then the let binds the payload of the optional if it matches.<div><br></div><div>I wouldn&#39;t rule out there being something better, but I&#39;m -1 on all the proposals I&#39;ve seen so far to change it.</div></div><div class="gmail_extra"><br><div class="gmail_quote">On Wed, Feb 3, 2016 at 7:49 PM, Taras Zakharko via swift-evolution <span dir="ltr">&lt;<a href="mailto:swift-evolution@swift.org" target="_blank">swift-evolution@swift.org</a>&gt;</span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div style="word-wrap:break-word">I already suggested this in the bind thread but I guess it was either not interesting or people missed it, so here it goes again :)<div><br></div><div>What about changing the syntax of optional binding such that the optional unwrapping becomes explicit? I.e. instead of </div><div><br></div><div>  if let x = some_optional { }</div><div><br></div><div>one writes</div><div><br></div><div>  if let x = some_optional! { }</div><div><br></div><div>Essentially, the point of this suggestion is that the runtime error generated by unwrapping an empty Optional is instead treated as condition failure in a conditional statement. While there is some typing overhead over the current syntax, I see a number of potential benefits of this approach:</div><div><br></div><div> 1. It is in line with the current semantics and syntax of optional unwrapping (does not introduce any new syntagm)</div><div> 2. It makes the unwrapping operation explicit (thus addressing the basic criticism from the bind discussion)</div><div> 3. It frees variable declaration of the contextual polisemy (i.e. let and var have the same semantics as nowhere else, there is no ‘unwrapping’ magic)</div><div> 4. The change is minimal compare to what we have now and can be easily ported automatically</div><div><br></div><div>Potential issues:</div><div><br></div><div> 1. One character typing overhead — but I dot think that should matter. I always had the impression that Swift favours clarity over compactness (which is a good thing IMO)</div><div> 2. it allows syntactic ambiguity with optional chaining. E.g. if let x = a.b?.c! { } and if let x = a.b!.c would have the same meaning. Then again, this ambiguity already exits in the language to begin with. </div><div><br></div><div>— Taras</div><div><div class="h5"><div><br></div><div><div><blockquote type="cite"><div>On 04 Feb 2016, at 01:25, Chris Lattner via swift-evolution &lt;<a href="mailto:swift-evolution@swift.org" target="_blank">swift-evolution@swift.org</a>&gt; wrote:</div><br><div><div style="font-family:Helvetica;font-size:12px;font-style:normal;font-weight:normal;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px"><blockquote type="cite"><div><br>On Feb 3, 2016, at 3:47 PM, Jordan Rose via swift-evolution &lt;<a href="mailto:swift-evolution@swift.org" target="_blank">swift-evolution@swift.org</a>&gt; wrote:</div><br><div><div style="word-wrap:break-word"><div>Data point (which Chris brought up already, I think?): We tried this* and got a<span> </span><i>lot</i> of negative feedback. Optionals are unwrapped too often for people to be comfortable writing &quot;if let name? = optionalCondition”.</div></div></div></blockquote><div><br></div><div>Yes, I even implemented this and it was in the compiler for awhile, then later ripped it back out.  You can find the history in git.  I would guess that this all happened in ~March 2015.</div><div><br></div><div>-Chris</div><div><br></div><blockquote type="cite"><div><div style="word-wrap:break-word"><div><br></div><div>It may be more uniform and even more pedantically correct, but our users hated it.</div><div><br></div><div>Jordan</div><div><br></div><div>* The actual thing we tried only allowed patterns that began with &#39;let&#39;, but that&#39;s close enough.</div><div><br></div><br><div><blockquote type="cite"><div>On Feb 3, 2016, at 15:36, Brent Royal-Gordon via swift-evolution &lt;<a href="mailto:swift-evolution@swift.org" target="_blank">swift-evolution@swift.org</a>&gt; wrote:</div><br><div><div>This is a continuation of and alternative proposal to &quot;The bind thread&quot;, which seems to have petered out without consensus.<br><br>Currently there are three forms of `if` statement (and `guard` and `while`, but for simplicity I&#39;ll just say `if` throughout this discussion):<br><br><span style="white-space:pre-wrap">        </span>if booleanCondition<br><span style="white-space:pre-wrap">        </span>if let name = optionalCondition<br><span style="white-space:pre-wrap">        </span>if case pattern = expression<br><br>The boolean condition form is fine, but there are flaws in the other two. `if let` is unprincipled and doesn&#39;t really say what it does; `if case` is bulky and rarely used.*<span> </span><br><br>One very interesting thing about `if case`, too, is that it can actually do optional unwrapping:<br><br><span style="white-space:pre-wrap">        </span>if case let name? = optionalCondition<br><br>This avoids the problems with `if let`—it&#39;s principled (it comes from a larger language feature) and it explicitly says it&#39;s handling optionality—but it still runs up against `if case`&#39;s rarity and wordiness.<br><br>So what I suggest is that we drop the `if let` form entirely and then drop the `case` keyword from `if case`. Pattern-matching conditions can still be distinguished from boolean conditions because boolean conditions can&#39;t contain an `=` operator. This, there would now only be two forms of if:<br><br><span style="white-space:pre-wrap">        </span>if booleanCondition<br><span style="white-space:pre-wrap">        </span>if pattern = expression<br><br>And the current `if let` is handled elegantly and clearly by existing pattern-matching shorthand, with only one additional character needed:<br><br><span style="white-space:pre-wrap">        </span>if let name? = optionalCondition<br><br>I see two complications with this.<br><br>The first is that, naively, `if let foo = bar` would still be valid, but would have different and vacuous behavior, since the pattern cannot fail to match. The compiler should probably emit an error or at least a warning when this happens.<br><br>The second is our other weird use of the `case` keyword, `for case`, which is now an orphan in the language. I see several ways this could be handled:<br><br>1. Drop the `for case` functionality entirely; if you want that behavior, use a pattern-matching `if`.<br>2. Replace the loop variable slot in the `for` statement with a pattern. This would force you to put `let` on all simple `for` statements.<br>3. Try to automatically distinguish between simple variables/tuples and patterns in this slot. What could possibly go wrong?<br>4. Require an equals sign before the `in`, like `for let foo? = in optionalFoos`. Looks a little gross, but it&#39;s unambiguous.<br>5. Replace `for case` with `for if`, like `for if let foo? in optionalFoos`. This helps flag the unusual conditional behavior of this form of `for`.<br>6. Just keep `for case` and don&#39;t worry about the fact that it&#39;s not parallel to the other statements anymore.<br><br>Thoughts on any of this?<br><br><br><br>* `if case` also has the problem that the `=` isn&#39;t appropriate unless you happen to bind some of the data matched by the pattern, but I don&#39;t know how to address that. A prior version of this proposal suggested saying `:=` instead of `=`, with the idea that `:=` could become a general pattern-matching operator, but the people I talked over this post with hated that.<br><br>--<span> </span><br>Brent Royal-Gordon<br>Architechies<br><br>_______________________________________________<br>swift-evolution mailing list<br><a href="mailto:swift-evolution@swift.org" target="_blank">swift-evolution@swift.org</a><br><a href="https://lists.swift.org/mailman/listinfo/swift-evolution" target="_blank">https://lists.swift.org/mailman/listinfo/swift-evolution</a><br></div></div></blockquote></div><br></div>_______________________________________________<br>swift-evolution mailing list<br><a href="mailto:swift-evolution@swift.org" target="_blank">swift-evolution@swift.org</a><br><a href="https://lists.swift.org/mailman/listinfo/swift-evolution" target="_blank">https://lists.swift.org/mailman/listinfo/swift-evolution</a><br></div></blockquote></div><br style="font-family:Helvetica;font-size:12px;font-style:normal;font-weight:normal;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px"><span style="font-family:Helvetica;font-size:12px;font-style:normal;font-weight:normal;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px;float:none;display:inline!important">_______________________________________________</span><br style="font-family:Helvetica;font-size:12px;font-style:normal;font-weight:normal;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px"><span style="font-family:Helvetica;font-size:12px;font-style:normal;font-weight:normal;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px;float:none;display:inline!important">swift-evolution mailing list</span><br style="font-family:Helvetica;font-size:12px;font-style:normal;font-weight:normal;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px"><a href="mailto:swift-evolution@swift.org" style="font-family:Helvetica;font-size:12px;font-style:normal;font-weight:normal;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px" target="_blank">swift-evolution@swift.org</a><br style="font-family:Helvetica;font-size:12px;font-style:normal;font-weight:normal;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px"><a href="https://lists.swift.org/mailman/listinfo/swift-evolution" style="font-family:Helvetica;font-size:12px;font-style:normal;font-weight:normal;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px" target="_blank">https://lists.swift.org/mailman/listinfo/swift-evolution</a></div></blockquote></div><br></div></div></div></div><br>_______________________________________________<br>
swift-evolution mailing list<br>
<a href="mailto:swift-evolution@swift.org">swift-evolution@swift.org</a><br>
<a href="https://lists.swift.org/mailman/listinfo/swift-evolution" rel="noreferrer" target="_blank">https://lists.swift.org/mailman/listinfo/swift-evolution</a><br>
<br></blockquote></div><br></div>