<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&#39;t allow multiple closures where only one of them<br>
&gt; should be run, and it should only be run once. I personally don&#39;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>
    let x = functionThatCallsAClosure(someTest()) { $0 ? 1 : 2 }<br>
<br>
?<br>
<br></blockquote><div><br></div><div>I&#39;m not saying it&#39;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">    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&#39;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> <br></div><div>I think that&#39;s a much larger change/discussion, with no clear victor.</div><div><br></div><div>However until Swift has that support it&#39;s necessary to consider separated<span style="font-size:13px"> 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&#39;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><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&#39;s<br>
less clear.  Just because we *can* do this doesn&#39;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;     on Tue May 03 2016, Chris Lattner<br>
&gt;     &lt;<a href="mailto:swift-evolution@swift.org" target="_blank">swift-evolution@swift.org</a>&gt; wrote:<br>
&gt;<br>
&gt;     &gt; Hello Swift community,<br>
&gt;     &gt;<br>
&gt;     &gt; The review of &quot;SE-0073: Marking closures as executing exactly once&quot;<br>
&gt;     &gt; begins now and runs through May 9. The proposal is available here:<br>
&gt;     &gt;<br>
&gt;     &gt;<br>
&gt;     <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;     &gt;<br>
&gt;     &gt; Reviews are an important part of the Swift evolution process. All reviews<br>
&gt;     should be sent to the swift-evolution mailing list at<br>
&gt;     &gt;<br>
&gt;     &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;     &gt;<br>
&gt;     &gt; or, if you would like to keep your feedback private, directly to the<br>
&gt;     review manager.<br>
&gt;     &gt;<br>
&gt;     &gt; What goes into a review?<br>
&gt;     &gt;<br>
&gt;     &gt; The goal of the review process is to improve the proposal under review<br>
&gt;     &gt; through constructive criticism and contribute to the direction of<br>
&gt;     &gt; Swift. When writing your review, here are some questions you might<br>
&gt;     &gt; want to answer in your review:<br>
&gt;     &gt;<br>
&gt;     &gt; * What is your evaluation of the proposal?<br>
&gt;<br>
&gt;     I think it&#39;s of questionable importance and doesn&#39;t generalize well.<br>
&gt;     For example, you can&#39;t use this to construct something like<br>
&gt;<br>
&gt;     var x: Int<br>
&gt;     functionThatActsLikeIf( someTest(), then: { x = 1 }, else: { x = 2} )<br>
&gt;<br>
&gt;     If you need to initialize something in an outer scope with something<br>
&gt;     computed by a closure, it&#39;s much better to arrange something like this:<br>
&gt;<br>
&gt;     var x = functionThatActsLikeIf( someTest(), then: { 1 }, else: { 2 } )<br>
&gt;<br>
&gt;     --<br>
&gt;     Dave<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>
&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>