<html><head><meta http-equiv="content-type" content="text/html; charset=utf-8"></head><body dir="auto"><div><br><br>Sent from my iPad</div><div><br>On May 6, 2016, at 10:10 PM, Andrew Bennett via swift-evolution &lt;<a href="mailto:swift-evolution@swift.org">swift-evolution@swift.org</a>&gt; wrote:<br><br></div><blockquote type="cite"><div><div dir="ltr">Replies inline:<br><div class="gmail_extra"><br><div class="gmail_quote">On Sat, May 7, 2016 at 12:37 PM, Dave Abrahams 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:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex"><span><br>
on Fri May 06 2016, Andrew Bennett &lt;<a href="mailto:swift-evolution@swift.org" target="_blank">swift-evolution@swift.org</a>&gt; wrote:<br>
<br>
&gt; Hi Dave,<br>
&gt;<br>
&gt; Sorry, Dave, sending a second time as I forgot to Reply-All.<br>
&gt;<br>
&gt; I agree, this proposal doesn't allow multiple closures where only one of them<br>
&gt; should be run, and it should only be run once. I personally don't think lacking<br>
&gt; that functionality is worth blocking this proposal for, another proposal can be<br>
&gt; built on top of this if it is desired.<br>
&gt;<br>
&gt; These cases can also be handled by a more meaningful if/switch statement, using<br>
&gt; @noescape(once), for example:<br>
&gt; let x: Int<br>
&gt; functionThatCallsAClosure(someTest()) { x = $0 ? 1 : 2 }<br>
<br>
</span>Why is this better than<br>
<br>
&nbsp; &nbsp; let x = functionThatCallsAClosure(someTest()) { $0 ? 1 : 2 }<br>
<br>
?<br>
<br></blockquote><div><br></div><div>I'm not saying it's better, neither is the proposal. I do think both are better than this though:</div><div><br></div></div></div><div class="gmail_extra"><div class="gmail_quote"><div><span style="color:rgb(80,0,80)"><font face="monospace, monospace">&nbsp; &nbsp; functionThatActsLikeIf( someTest(), then: { x = 1 }, else: { x = 2} )</font></span></div></div></div><div class="gmail_extra"><div class="gmail_quote"><div><br></div><div>My opinion is that cases where <i>the proposal</i> are limited by multiple closures seem to be cases where you would be better off with a single closure and more explicit control-flow. I'd be interested if there are other cases, but it currently seems like a straw-man argument to me.</div><div><br></div><div>--</div><div><br></div><div>It may be useful if Swift allowed things like this:</div><div><br></div><div><font face="monospace, monospace">let x = switch { ... }</font></div><div><font face="monospace, monospace">let x = if { ... } else { ... }</font></div><div><font face="monospace, monospace">etc.</font></div><div>&nbsp;<br></div><div>I think that's a much larger change/discussion, with no clear victor.</div><div><br></div><div>However until Swift has that support it's necessary to consider separated<span style="font-size:13px">&nbsp;initialization and declaration. Likewise until all Swift is pure functional.</span></div><div><span style="font-size:13px"><br></span></div><div>Even if this proposal didn't let you assign to let statements outside the closure it still has value:</div><div><ul><li>It lets the type system reduce programmer error</li><li>It allows protocol declarations to have a more explicit requirement</li><li>The user can guarantee that their code, and its side-effects, will be executed</li></ul></div></div></div></div></div></blockquote><div><br></div>+1.<div><br><blockquote type="cite"><div><div dir="ltr"><div class="gmail_extra"><div class="gmail_quote"><div><div><br></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">
IMO separating initialization from declaration is *very* rarely needed<br>
and very much better avoided altogether, because it leads to code that's<br>
less clear.&nbsp; Just because we *can* do this doesn't mean we should.<br>
<div><div><br>
&gt; On Sat, May 7, 2016 at 6:24 AM, Dave Abrahams via swift-evolution<br>
&gt; &lt;<a href="mailto:swift-evolution@swift.org" target="_blank">swift-evolution@swift.org</a>&gt; wrote:<br>
&gt;<br>
&gt;&nbsp; &nbsp; &nbsp;on Tue May 03 2016, Chris Lattner<br>
&gt;&nbsp; &nbsp; &nbsp;&lt;<a href="mailto:swift-evolution@swift.org" target="_blank">swift-evolution@swift.org</a>&gt; wrote:<br>
&gt;<br>
&gt;&nbsp; &nbsp; &nbsp;&gt; Hello Swift community,<br>
&gt;&nbsp; &nbsp; &nbsp;&gt;<br>
&gt;&nbsp; &nbsp; &nbsp;&gt; The review of "SE-0073: Marking closures as executing exactly once"<br>
&gt;&nbsp; &nbsp; &nbsp;&gt; begins now and runs through May 9. The proposal is available here:<br>
&gt;&nbsp; &nbsp; &nbsp;&gt;<br>
&gt;&nbsp; &nbsp; &nbsp;&gt;<br>
&gt;&nbsp; &nbsp; &nbsp;<a href="https://github.com/apple/swift-evolution/blob/master/proposals/0073-noescape-once.md" rel="noreferrer" target="_blank">https://github.com/apple/swift-evolution/blob/master/proposals/0073-noescape-once.md</a><br>
&gt;<br>
&gt;&nbsp; &nbsp; &nbsp;&gt;<br>
&gt;&nbsp; &nbsp; &nbsp;&gt; Reviews are an important part of the Swift evolution process. All reviews<br>
&gt;&nbsp; &nbsp; &nbsp;should be sent to the swift-evolution mailing list at<br>
&gt;&nbsp; &nbsp; &nbsp;&gt;<br>
&gt;&nbsp; &nbsp; &nbsp;&gt; <a href="https://lists.swift.org/mailman/listinfo/swift-evolution" rel="noreferrer" target="_blank">https://lists.swift.org/mailman/listinfo/swift-evolution</a><br>
&gt;&nbsp; &nbsp; &nbsp;&gt;<br>
&gt;&nbsp; &nbsp; &nbsp;&gt; or, if you would like to keep your feedback private, directly to the<br>
&gt;&nbsp; &nbsp; &nbsp;review manager.<br>
&gt;&nbsp; &nbsp; &nbsp;&gt;<br>
&gt;&nbsp; &nbsp; &nbsp;&gt; What goes into a review?<br>
&gt;&nbsp; &nbsp; &nbsp;&gt;<br>
&gt;&nbsp; &nbsp; &nbsp;&gt; The goal of the review process is to improve the proposal under review<br>
&gt;&nbsp; &nbsp; &nbsp;&gt; through constructive criticism and contribute to the direction of<br>
&gt;&nbsp; &nbsp; &nbsp;&gt; Swift. When writing your review, here are some questions you might<br>
&gt;&nbsp; &nbsp; &nbsp;&gt; want to answer in your review:<br>
&gt;&nbsp; &nbsp; &nbsp;&gt;<br>
&gt;&nbsp; &nbsp; &nbsp;&gt; * What is your evaluation of the proposal?<br>
&gt;<br>
&gt;&nbsp; &nbsp; &nbsp;I think it's of questionable importance and doesn't generalize well.<br>
&gt;&nbsp; &nbsp; &nbsp;For example, you can't use this to construct something like<br>
&gt;<br>
&gt;&nbsp; &nbsp; &nbsp;var x: Int<br>
&gt;&nbsp; &nbsp; &nbsp;functionThatActsLikeIf( someTest(), then: { x = 1 }, else: { x = 2} )<br>
&gt;<br>
&gt;&nbsp; &nbsp; &nbsp;If you need to initialize something in an outer scope with something<br>
&gt;&nbsp; &nbsp; &nbsp;computed by a closure, it's much better to arrange something like this:<br>
&gt;<br>
&gt;&nbsp; &nbsp; &nbsp;var x = functionThatActsLikeIf( someTest(), then: { 1 }, else: { 2 } )<br>
&gt;<br>
&gt;&nbsp; &nbsp; &nbsp;--<br>
&gt;&nbsp; &nbsp; &nbsp;Dave<br>
&gt;<br>
&gt;&nbsp; &nbsp; &nbsp;_______________________________________________<br>
&gt;&nbsp; &nbsp; &nbsp;swift-evolution mailing list<br>
&gt;&nbsp; &nbsp; &nbsp;<a href="mailto:swift-evolution@swift.org" target="_blank">swift-evolution@swift.org</a><br>
&gt;&nbsp; &nbsp; &nbsp;<a href="https://lists.swift.org/mailman/listinfo/swift-evolution" rel="noreferrer" target="_blank">https://lists.swift.org/mailman/listinfo/swift-evolution</a><br>
&gt;<br>
&gt; _______________________________________________<br>
&gt; swift-evolution mailing list<br>
&gt; <a href="mailto:swift-evolution@swift.org" target="_blank">swift-evolution@swift.org</a><br>
&gt; <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>
--<br>
Dave<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" rel="noreferrer" target="_blank">https://lists.swift.org/mailman/listinfo/swift-evolution</a><br>
</div></div></blockquote></div><br></div></div>
</div></blockquote><blockquote type="cite"><div><span>_______________________________________________</span><br><span>swift-evolution mailing list</span><br><span><a href="mailto:swift-evolution@swift.org">swift-evolution@swift.org</a></span><br><span><a href="https://lists.swift.org/mailman/listinfo/swift-evolution">https://lists.swift.org/mailman/listinfo/swift-evolution</a></span><br></div></blockquote></div></body></html>