<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 Aug 15, 2016, at 9:46 AM, Justin Jia via swift-evolution &lt;<a href="mailto:swift-evolution@swift.org" class="">swift-evolution@swift.org</a>&gt; wrote:</div><br class="Apple-interchange-newline"><div class=""><meta http-equiv="Content-Type" content="text/html charset=utf-8" class=""><div style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class=""><div style="margin: 0px; line-height: normal;" class=""><div style="margin: 0px; line-height: normal;" class=""><font face="Helvetica Neue" class=""><span style="font-size: 12.5px;" class="">I think the `?` will make the return an optional. So your example should add another ? at the end.</span></font></div><div style="margin: 0px; line-height: normal;" class=""><font face="Helvetica Neue" class=""><span style="font-size: 12.5px;" class=""><br class=""></span></font></div><div style="margin: 0px; line-height: normal;" class=""><font face="Helvetica Neue" class=""><span style="font-size: 12.5px;" class="">```</span></font></div><div style="margin: 0px; line-height: normal;" class=""><font face="Helvetica Neue" class=""><span style="font-size: 12.5px;" class="">print(foo(bar(42)?, baz(42)?)?)</span></font></div></div></div></div></blockquote><div><br class=""></div><div>This reads terribly, IMHO.</div><br class=""><blockquote type="cite" class=""><div class=""><div style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class=""><div style="margin: 0px; line-height: normal;" class=""><div style="margin: 0px; line-height: normal;" class=""><font face="Helvetica Neue" class=""><span style="font-size: 12.5px;" class="">```</span></font></div><div style="margin: 0px; line-height: normal;" class=""><font face="Helvetica Neue" class=""><span style="font-size: 12.5px;" class=""><br class=""></span></font></div><div style="margin: 0px; line-height: normal;" class=""><font face="Helvetica Neue" class=""><span style="font-size: 12.5px;" class="">The above example should be equivalent to:</span></font></div><div style="margin: 0px; line-height: normal;" class=""><font face="Helvetica Neue" class=""><span style="font-size: 12.5px;" class=""><br class=""></span></font></div><div style="margin: 0px; line-height: normal;" class=""><font face="Helvetica Neue" class=""><span style="font-size: 12.5px;" class="">```</span></font></div><div style="margin: 0px; line-height: normal;" class=""><font face="Helvetica Neue" class=""><span style="font-size: 12.5px;" class="">let x = bar(42) // X is optional</span></font></div><div style="margin: 0px; line-height: normal;" class=""><font face="Helvetica Neue" class=""><span style="font-size: 12.5px;" class="">let y = baz(42) // Y is optional</span></font></div><div style="margin: 0px; line-height: normal;" class=""><font face="Helvetica Neue" class=""><span style="font-size: 12.5px;" class=""><br class=""></span></font></div><div style="margin: 0px; line-height: normal;" class=""><font face="Helvetica Neue" class=""><span style="font-size: 12.5px;" class="">let z = foo(x?, y?) // Z should be optional now</span></font></div><div style="margin: 0px; line-height: normal;" class=""><font face="Helvetica Neue" class=""><span style="font-size: 12.5px;" class="">print(z?)</span></font></div><div style="margin: 0px; line-height: normal;" class=""><font face="Helvetica Neue" class=""><span style="font-size: 12.5px;" class="">```</span></font></div><div style="margin: 0px; line-height: normal;" class=""><font face="Helvetica Neue" class=""><span style="font-size: 12.5px;" class=""><br class=""></span></font></div><div style="margin: 0px; line-height: normal;" class=""><font face="Helvetica Neue" class=""><span style="font-size: 12.5px;" class="">which should be equivalent to;</span></font></div><div style="margin: 0px; line-height: normal;" class=""><font face="Helvetica Neue" class=""><span style="font-size: 12.5px;" class=""><br class=""></span></font></div><div style="margin: 0px; line-height: normal;" class=""><font face="Helvetica Neue" class=""><span style="font-size: 12.5px;" class="">```</span></font></div><div style="margin: 0px; line-height: normal;" class=""><font face="Helvetica Neue" class=""><span style="font-size: 12.5px;" class="">let x = bar(42)</span></font></div><div style="margin: 0px; line-height: normal;" class=""><font face="Helvetica Neue" class=""><span style="font-size: 12.5px;" class="">let y = baz(42)</span></font></div><div style="margin: 0px; line-height: normal;" class=""><font face="Helvetica Neue" class=""><span style="font-size: 12.5px;" class=""><br class=""></span></font></div><div style="margin: 0px; line-height: normal;" class=""><font face="Helvetica Neue" class=""><span style="font-size: 12.5px;" class="">if let x = x, let y = y {</span></font></div><div style="margin: 0px; line-height: normal;" class=""><font face="Helvetica Neue" class=""><span style="font-size: 12.5px;" class="">&nbsp; &nbsp; z = foo(x, y)</span></font></div><div style="margin: 0px; line-height: normal;" class=""><font face="Helvetica Neue" class=""><span style="font-size: 12.5px;" class="">}</span></font></div></div></div></div></blockquote><div><br class=""></div><div>What if baz doesn't return optional?</div><div><br class=""></div><div>if let x = bar(42) {</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>let y = baz(42)</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>z = foo(x, y)</div><div>}</div><div><br class=""></div><div>or&nbsp;</div><div><br class=""></div><div>let y = baz(42)</div><div><div>if let x = bar(42) {</div><div><span class="Apple-tab-span" style="white-space: pre;">        </span>z = foo(x, y)</div><div>}</div><div><br class=""></div><div><br class=""></div><div>If both are evaluated, this is really inconsistent with</div><div><br class=""></div><div>if let x = bar(42), y = baz(42) { ... }</div><div><br class=""></div><div>which will short-circuit and baz will not be evaluated if x is evaluated as nil.</div></div><br class=""><blockquote type="cite" class=""><div class=""><div style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class=""><div style="margin: 0px; line-height: normal;" class=""><div style="margin: 0px; line-height: normal;" class=""><font face="Helvetica Neue" class=""><span style="font-size: 12.5px;" class=""><br class=""></span></font></div><div style="margin: 0px; line-height: normal;" class=""><font face="Helvetica Neue" class=""><span style="font-size: 12.5px;" class="">if let z = z {</span></font></div><div style="margin: 0px; line-height: normal;" class=""><font face="Helvetica Neue" class=""><span style="font-size: 12.5px;" class="">&nbsp; &nbsp; print(z)</span></font></div><div style="margin: 0px; line-height: normal;" class=""><font face="Helvetica Neue" class=""><span style="font-size: 12.5px;" class="">}</span></font></div><div style="margin: 0px; line-height: normal;" class=""><font face="Helvetica Neue" class=""><span style="font-size: 12.5px;" class="">```</span></font></div><div style="margin: 0px; line-height: normal;" class=""><font face="Helvetica Neue" class=""><span style="font-size: 12.5px;" class=""><br class=""></span></font></div><div style="margin: 0px; line-height: normal;" class=""><font face="Helvetica Neue" class=""><span style="font-size: 12.5px;" class="">We&nbsp;don’t need to worry about&nbsp;“short-circuit” now because it&nbsp;should be&nbsp;equivalent to the above syntax.</span></font></div><div style="margin: 0px; line-height: normal;" class=""><font face="Helvetica Neue" class=""><span style="font-size: 12.5px;" class=""><br class=""></span></font></div><div style="margin: 0px; line-height: normal;" class=""><font face="Helvetica Neue" class=""><span style="font-size: 12.5px;" class="">&gt; It has been mentioned before (more than once, perhaps, but not in its own thread I don't think, so good luck finding it). IIRC, one of the problems is that it's unclear what happens if your function takes multiple arguments. Does evaluation proceed from left to right? does it short-circuit? Put concretely:</span></font></div><div style="margin: 0px; line-height: normal;" class=""><font face="Helvetica Neue" class=""><span style="font-size: 12.5px;" class="">&gt;&nbsp;</span></font></div><div style="margin: 0px; line-height: normal;" class=""><font face="Helvetica Neue" class=""><span style="font-size: 12.5px;" class="">&gt; ```</span></font></div><div style="margin: 0px; line-height: normal;" class=""><font face="Helvetica Neue" class=""><span style="font-size: 12.5px;" class="">&gt; func bar(_ x: Int) -&gt;Int? { /* side effects */ }</span></font></div><div style="margin: 0px; line-height: normal;" class=""><font face="Helvetica Neue" class=""><span style="font-size: 12.5px;" class="">&gt; func baz(_ y: Int) -&gt;Int? { /* side effects */ }</span></font></div><div style="margin: 0px; line-height: normal;" class=""><font face="Helvetica Neue" class=""><span style="font-size: 12.5px;" class="">&gt; func foo(_ z: Int, _ a: Int) -&gt;Int { /* ... */ }</span></font></div><div style="margin: 0px; line-height: normal;" class=""><font face="Helvetica Neue" class=""><span style="font-size: 12.5px;" class="">&gt;&nbsp;</span></font></div><div style="margin: 0px; line-height: normal;" class=""><font face="Helvetica Neue" class=""><span style="font-size: 12.5px;" class="">&gt; print(foo(bar(42)?, baz(42)?))</span></font></div><div style="margin: 0px; line-height: normal;" class=""><font face="Helvetica Neue" class=""><span style="font-size: 12.5px;" class="">&gt; ```</span></font></div><div style="margin: 0px; line-height: normal;" class=""><font face="Helvetica Neue" class=""><span style="font-size: 12.5px;" class="">&gt;&nbsp;</span></font></div><div style="margin: 0px; line-height: normal;" class=""><font face="Helvetica Neue" class=""><span style="font-size: 12.5px;" class="">&gt; Does baz(42) get evaluated if bar returns nil? Does bar(42) get evaluated if baz returns nil?</span></font></div><div style="margin: 0px; line-height: normal;" class=""><font face="Helvetica Neue" class=""><span style="font-size: 12.5px;" class="">&gt;&nbsp;</span></font></div><div style="margin: 0px; line-height: normal;" class=""><font face="Helvetica Neue" class=""><span style="font-size: 12.5px;" class="">&gt;&nbsp;</span></font></div><div style="margin: 0px; line-height: normal;" class=""><font face="Helvetica Neue" class=""><span style="font-size: 12.5px;" class="">&gt; On Mon, Aug 15, 2016 at 2:02 AM, Justin Jia via swift-evolution&lt;<a href="mailto:swift-evolution@swift.org" class="">swift-evolution@swift.org</a>(<a href="mailto:swift-evolution@swift.org" class="">mailto:swift-evolution@swift.org</a>)&gt;wrote:</span></font></div><div style="margin: 0px; line-height: normal;" class=""><font face="Helvetica Neue" class=""><span style="font-size: 12.5px;" class="">&gt; &gt; Hi!</span></font></div><div style="margin: 0px; line-height: normal;" class=""><font face="Helvetica Neue" class=""><span style="font-size: 12.5px;" class="">&gt; &gt;&nbsp;</span></font></div><div style="margin: 0px; line-height: normal;" class=""><font face="Helvetica Neue" class=""><span style="font-size: 12.5px;" class="">&gt; &gt; I don’t know if this has came up before. I tried to search though the mailing list but didn’t find any related threads.</span></font></div><div style="margin: 0px; line-height: normal;" class=""><font face="Helvetica Neue" class=""><span style="font-size: 12.5px;" class="">&gt; &gt;&nbsp;</span></font></div><div style="margin: 0px; line-height: normal;" class=""><font face="Helvetica Neue" class=""><span style="font-size: 12.5px;" class="">&gt; &gt; This is purely a syntactic thing (which I know it’s the lowest priority for Swift 4), but I think it’s an important one.</span></font></div><div style="margin: 0px; line-height: normal;" class=""><font face="Helvetica Neue" class=""><span style="font-size: 12.5px;" class="">&gt; &gt;&nbsp;</span></font></div><div style="margin: 0px; line-height: normal;" class=""><font face="Helvetica Neue" class=""><span style="font-size: 12.5px;" class="">&gt; &gt; Let’s say we have a struct with a function:</span></font></div><div style="margin: 0px; line-height: normal;" class=""><font face="Helvetica Neue" class=""><span style="font-size: 12.5px;" class="">&gt; &gt;&nbsp;</span></font></div><div style="margin: 0px; line-height: normal;" class=""><font face="Helvetica Neue" class=""><span style="font-size: 12.5px;" class="">&gt; &gt; ```</span></font></div><div style="margin: 0px; line-height: normal;" class=""><font face="Helvetica Neue" class=""><span style="font-size: 12.5px;" class="">&gt; &gt; struct Foo {</span></font></div><div style="margin: 0px; line-height: normal;" class=""><font face="Helvetica Neue" class=""><span style="font-size: 12.5px;" class="">&gt; &gt; func bar(x: Int)</span></font></div><div style="margin: 0px; line-height: normal;" class=""><font face="Helvetica Neue" class=""><span style="font-size: 12.5px;" class="">&gt; &gt; }</span></font></div><div style="margin: 0px; line-height: normal;" class=""><font face="Helvetica Neue" class=""><span style="font-size: 12.5px;" class="">&gt; &gt; ```</span></font></div><div style="margin: 0px; line-height: normal;" class=""><font face="Helvetica Neue" class=""><span style="font-size: 12.5px;" class="">&gt; &gt;&nbsp;</span></font></div><div style="margin: 0px; line-height: normal;" class=""><font face="Helvetica Neue" class=""><span style="font-size: 12.5px;" class="">&gt; &gt; We can use optionals:</span></font></div><div style="margin: 0px; line-height: normal;" class=""><font face="Helvetica Neue" class=""><span style="font-size: 12.5px;" class="">&gt; &gt;&nbsp;</span></font></div><div style="margin: 0px; line-height: normal;" class=""><font face="Helvetica Neue" class=""><span style="font-size: 12.5px;" class="">&gt; &gt; ```</span></font></div><div style="margin: 0px; line-height: normal;" class=""><font face="Helvetica Neue" class=""><span style="font-size: 12.5px;" class="">&gt; &gt; let foo: Foo? = nil</span></font></div><div style="margin: 0px; line-height: normal;" class=""><font face="Helvetica Neue" class=""><span style="font-size: 12.5px;" class="">&gt; &gt; let x = 1</span></font></div><div style="margin: 0px; line-height: normal;" class=""><font face="Helvetica Neue" class=""><span style="font-size: 12.5px;" class="">&gt; &gt; foo!.bar(x: x) // Able to compile, but will cause runtime error</span></font></div><div style="margin: 0px; line-height: normal;" class=""><font face="Helvetica Neue" class=""><span style="font-size: 12.5px;" class="">&gt; &gt; foo?.bar(x: x) // Able to compile, and won't cause runtime error</span></font></div><div style="margin: 0px; line-height: normal;" class=""><font face="Helvetica Neue" class=""><span style="font-size: 12.5px;" class="">&gt; &gt; ```</span></font></div><div style="margin: 0px; line-height: normal;" class=""><font face="Helvetica Neue" class=""><span style="font-size: 12.5px;" class="">&gt; &gt;&nbsp;</span></font></div><div style="margin: 0px; line-height: normal;" class=""><font face="Helvetica Neue" class=""><span style="font-size: 12.5px;" class="">&gt; &gt; However:</span></font></div><div style="margin: 0px; line-height: normal;" class=""><font face="Helvetica Neue" class=""><span style="font-size: 12.5px;" class="">&gt; &gt;&nbsp;</span></font></div><div style="margin: 0px; line-height: normal;" class=""><font face="Helvetica Neue" class=""><span style="font-size: 12.5px;" class="">&gt; &gt; ```</span></font></div><div style="margin: 0px; line-height: normal;" class=""><font face="Helvetica Neue" class=""><span style="font-size: 12.5px;" class="">&gt; &gt; let foo = Foo()</span></font></div><div style="margin: 0px; line-height: normal;" class=""><font face="Helvetica Neue" class=""><span style="font-size: 12.5px;" class="">&gt; &gt; let x: Int? = nil</span></font></div><div style="margin: 0px; line-height: normal;" class=""><font face="Helvetica Neue" class=""><span style="font-size: 12.5px;" class="">&gt; &gt; foo.bar(x: x!) // Able to compile, but will cause runtime error</span></font></div><div style="margin: 0px; line-height: normal;" class=""><font face="Helvetica Neue" class=""><span style="font-size: 12.5px;" class="">&gt; &gt; foo.bar(x: x?) // Won't compile</span></font></div><div style="margin: 0px; line-height: normal;" class=""><font face="Helvetica Neue" class=""><span style="font-size: 12.5px;" class="">&gt; &gt; ```</span></font></div><div style="margin: 0px; line-height: normal;" class=""><font face="Helvetica Neue" class=""><span style="font-size: 12.5px;" class="">&gt; &gt;&nbsp;</span></font></div><div style="margin: 0px; line-height: normal;" class=""><font face="Helvetica Neue" class=""><span style="font-size: 12.5px;" class="">&gt; &gt; I propose that we should allow `foo.bar(x: x?)`, which should be equivalent to:</span></font></div><div style="margin: 0px; line-height: normal;" class=""><font face="Helvetica Neue" class=""><span style="font-size: 12.5px;" class="">&gt; &gt;&nbsp;</span></font></div><div style="margin: 0px; line-height: normal;" class=""><font face="Helvetica Neue" class=""><span style="font-size: 12.5px;" class="">&gt; &gt; ```</span></font></div><div style="margin: 0px; line-height: normal;" class=""><font face="Helvetica Neue" class=""><span style="font-size: 12.5px;" class="">&gt; &gt; if let x = x {</span></font></div><div style="margin: 0px; line-height: normal;" class=""><font face="Helvetica Neue" class=""><span style="font-size: 12.5px;" class="">&gt; &gt; foo.bar(x: x)</span></font></div><div style="margin: 0px; line-height: normal;" class=""><font face="Helvetica Neue" class=""><span style="font-size: 12.5px;" class="">&gt; &gt; }</span></font></div><div style="margin: 0px; line-height: normal;" class=""><font face="Helvetica Neue" class=""><span style="font-size: 12.5px;" class="">&gt; &gt; ```</span></font></div><div style="margin: 0px; line-height: normal;" class=""><font face="Helvetica Neue" class=""><span style="font-size: 12.5px;" class="">&gt; &gt;&nbsp;</span></font></div><div style="margin: 0px; line-height: normal;" class=""><font face="Helvetica Neue" class=""><span style="font-size: 12.5px;" class="">&gt; &gt; What do you think?</span></font></div><div style="margin: 0px; line-height: normal;" class=""><font face="Helvetica Neue" class=""><span style="font-size: 12.5px;" class="">&gt; &gt;&nbsp;</span></font></div><div style="margin: 0px; line-height: normal;" class=""><font face="Helvetica Neue" class=""><span style="font-size: 12.5px;" class="">&gt; &gt; Thanks,</span></font></div><div style="margin: 0px; line-height: normal;" class=""><font face="Helvetica Neue" class=""><span style="font-size: 12.5px;" class="">&gt; &gt; Justin</span></font></div><div style="margin: 0px; line-height: normal;" class=""><font face="Helvetica Neue" class=""><span style="font-size: 12.5px;" class="">&gt; &gt;&nbsp;</span></font></div><div style="margin: 0px; line-height: normal;" class=""><font face="Helvetica Neue" class=""><span style="font-size: 12.5px;" class="">&gt; &gt; _______________________________________________</span></font></div><div style="margin: 0px; line-height: normal;" class=""><font face="Helvetica Neue" class=""><span style="font-size: 12.5px;" class="">&gt; &gt; swift-evolution mailing list</span></font></div><div style="margin: 0px; line-height: normal;" class=""><font face="Helvetica Neue" class=""><span style="font-size: 12.5px;" class="">&gt; &gt; <a href="mailto:swift-evolution@swift.org" class="">swift-evolution@swift.org</a>(<a href="mailto:swift-evolution@swift.org" class="">mailto:swift-evolution@swift.org</a>)</span></font></div><div style="margin: 0px; line-height: normal;" class=""><font face="Helvetica Neue" class=""><span style="font-size: 12.5px;" class="">&gt; &gt; <a href="https://lists.swift.org/mailman/listinfo/swift-evolution" class="">https://lists.swift.org/mailman/listinfo/swift-evolution</a></span></font></div><div style="margin: 0px; line-height: normal;" class=""><font face="Helvetica Neue" class=""><span style="font-size: 12.5px;" class="">&gt;&nbsp;</span></font></div><div style="margin: 0px; line-height: normal;" class=""><font face="Helvetica Neue" class=""><span style="font-size: 12.5px;" class="">&gt;&nbsp;</span></font></div><div style="margin: 0px; line-height: normal;" class=""><font face="Helvetica Neue" class=""><span style="font-size: 12.5px;" class="">&gt;&nbsp;</span></font></div></div></div>_______________________________________________<br class="">swift-evolution mailing list<br class=""><a href="mailto:swift-evolution@swift.org" class="">swift-evolution@swift.org</a><br class="">https://lists.swift.org/mailman/listinfo/swift-evolution<br class=""></div></blockquote></div><br class=""></body></html>