<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="">I like the idea of the case let syntax option except for the fact that we have existing syntax for decomposing tuples that doesn’t use case-<div class=""><br class=""></div><div class=""><pre style="box-sizing: border-box; font-family: SFMono-Regular, Consolas, 'Liberation Mono', Menlo, Courier, monospace; font-size: 13.600000381469727px; margin-top: 0px; margin-bottom: 0px; line-height: 1.45; word-wrap: normal; padding: 16px; overflow: auto; background-color: rgb(246, 248, 250); border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; word-break: normal; color: rgb(36, 41, 46);" class=""><span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">let</span> (<span class="pl-c1" style="box-sizing: border-box; color: rgb(0, 134, 179);">_</span>, age) <span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">=</span> arg</pre><div class=""><br class=""></div></div><div class=""><br class=""></div><div class="">Reusing this syntax feels like a better option than introducing a slight variant of it just for closures-</div><div class=""><br class=""></div><div class=""><br class=""></div><div class=""><pre style="box-sizing: border-box; font-family: SFMono-Regular, Consolas, 'Liberation Mono', Menlo, Courier, monospace; font-size: 13.600000381469727px; margin-top: 0px; margin-bottom: 0px; line-height: 1.45; word-wrap: normal; padding: 16px; overflow: auto; background-color: rgb(246, 248, 250); border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; word-break: normal; color: rgb(36, 41, 46);" class=""><span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">let</span> eighteenOrMore <span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">=</span> [<span class="pl-s" style="box-sizing: border-box; color: rgb(24, 54, 145);"><span class="pl-pds" style="box-sizing: border-box;">"</span>Tom<span class="pl-pds" style="box-sizing: border-box;">"</span></span> <span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">:</span> <span class="pl-c1" style="box-sizing: border-box; color: rgb(0, 134, 179);">33</span>, <span class="pl-s" style="box-sizing: border-box; color: rgb(24, 54, 145);"><span class="pl-pds" style="box-sizing: border-box;">"</span>Rebecca<span class="pl-pds" style="box-sizing: border-box;">"</span></span> <span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">:</span> <span class="pl-c1" style="box-sizing: border-box; color: rgb(0, 134, 179);">17</span>, <span class="pl-s" style="box-sizing: border-box; color: rgb(24, 54, 145);"><span class="pl-pds" style="box-sizing: border-box;">"</span>Siri<span class="pl-pds" style="box-sizing: border-box;">"</span></span> <span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">:</span> <span class="pl-c1" style="box-sizing: border-box; color: rgb(0, 134, 179);">5</span>].<span class="pl-c1" style="box-sizing: border-box; color: rgb(0, 134, 179);">filter</span> { <span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">let</span> (<span class="pl-c1" style="box-sizing: border-box; color: rgb(0, 134, 179);">_</span>, age) <span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">in</span>
  <span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">return</span> age <span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">&gt;=</span> <span class="pl-c1" style="box-sizing: border-box; color: rgb(0, 134, 179);">18</span>
}</pre><div class=""><br class=""></div></div><div class=""><br class=""></div><div class="">-Simon</div><div class=""><br class=""><div><blockquote type="cite" class=""><div class="">On 2 Jun 2017, at 12:25 pm, Tommaso Piazza 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=""><div class=""><div style="background-color: rgb(255, 255, 255); font-family: 'Helvetica Neue', Helvetica, Arial, 'Lucida Grande', sans-serif; font-size: 13px;" class=""><div id="yui_3_16_0_ym19_1_1496431447786_4791" class=""><span class="">Thanks, added.</span></div> <div class="qtdSeparateBR"><br class=""><br class=""></div><div class="yahoo_quoted" style="display: block;"> <div style="font-family: Helvetica Neue, Helvetica, Arial, Lucida Grande, sans-serif; font-size: 13px;" class=""> <div style="font-family: HelveticaNeue, Helvetica Neue, Helvetica, Arial, Lucida Grande, sans-serif; font-size: 16px;" class=""> <div dir="ltr" class=""><font size="2" face="Arial" class=""> On Friday, June 2, 2017 1:18 PM, Vladimir.S &lt;<a href="mailto:svabox@gmail.com" class="">svabox@gmail.com</a>&gt; wrote:<br class=""></font></div>  <br class=""><br class=""> <div class="y_msg_container"><div dir="ltr" class="">On 02.06.2017 2:34, Tommaso Piazza wrote:<br clear="none" class="">&gt; Is the version you suggest to add to my list for the Swift syntax currently valid as <br clear="none" class="">&gt; of SE-0110 in Swift 4?<br clear="none" class=""><br clear="none" class="">Yes, just checked on latest dev snapshot of Swift 4.<br clear="none" class=""><br clear="none" class="">&gt; <br clear="none" class="">&gt; <br clear="none" class="">&gt; On Thursday, June 1, 2017 9:32 PM, Vladimir.S &lt;<a shape="rect" ymailto="mailto:svabox@gmail.com" href="mailto:svabox@gmail.com" class="">svabox@gmail.com</a>&gt; wrote:<br clear="none" class="">&gt; <br clear="none" class="">&gt; <br clear="none" class="">&gt; On 01.06.2017 19:31, Tommaso Piazza wrote:<br clear="none" class="">&gt;&nbsp; &gt; Dear all,<br clear="none" class="">&gt;&nbsp; &gt;<br clear="none" class="">&gt;&nbsp; &gt; I made a comparison of Swift's 4 lack of tuple unsplatting, here is how it stands in<br clear="none" class="">&gt;&nbsp; &gt; comparison with other languages<br clear="none" class="">&gt;&nbsp; &gt;<br clear="none" class="">&gt;&nbsp; &gt; <a shape="rect" href="https://gist.github.com/blender/53f9568617654c38a219dd4a8353d935" target="_blank" class="">https://gist.github.com/blender/53f9568617654c38a219dd4a8353d935</a><br clear="none" class="">&gt;&nbsp; &gt;<br clear="none" class="">&gt; <br clear="none" class="">&gt; Thank you! Very useful information. And also I really like the opinion of<br clear="none" class="">&gt; @AliSoftware in comments for this article.<br clear="none" class="">&gt; <br clear="none" class="">&gt; I'd suggest to add this variant to Swift section in your article:<br clear="none" class="">&gt; <br clear="none" class="">&gt; let eighteenOrMore = ["Tom" : 33, "Rebecca" : 17, "Siri" : 5].filter {<br clear="none" class="">&gt;&nbsp; &nbsp; &nbsp; (arg: (name: String, age: Int)) in arg.age &gt;= 18 }<br clear="none" class="">&gt; <br clear="none" class="">&gt; (I believe it is better that 2 others Swift variants.)<br clear="none" class="">&gt; <br clear="none" class="">&gt; It seems for me that we need to allow some special syntax for *explicit* tuple<br clear="none" class="">&gt; destructuring in closures to make all happy.<br clear="none" class="">&gt; <br clear="none" class="">&gt; FWIW These suggestions are my favorite:<br clear="none" class="">&gt; <br clear="none" class="">&gt; 1. Just allow type inference for tuple's destructured variables in this position:<br clear="none" class="">&gt; <br clear="none" class="">&gt; .filter { (arg: (name, age)) in arg.age &gt;= 18 }<br clear="none" class="">&gt; <br clear="none" class="">&gt; <br clear="none" class="">&gt; 2. (1) + allow underscore for tuple argument name:<br clear="none" class="">&gt; <br clear="none" class="">&gt; .filter { (_: (name, age)) in age &gt;= 18 }<br clear="none" class="">&gt; <br clear="none" class="">&gt; <br clear="none" class="">&gt; 3. (2) + allow to omit parenthesis (probably only in case of just one tuple argument)<br clear="none" class="">&gt; <br clear="none" class="">&gt; .filter { _: (name, age) in age &gt;= 18 }<br clear="none" class="">&gt; <br clear="none" class="">&gt; <br clear="none" class="">&gt; 4. Use pattern matching syntax:<br clear="none" class="">&gt; <br clear="none" class="">&gt; .filter { case let (name, age) in age &gt;= 18 }<br clear="none" class="">&gt; <br clear="none" class="">&gt; (looks similar as allowed today: if case let (name, age) = x { print(name, age) }&nbsp; )<br clear="none" class="">&gt; <br clear="none" class="">&gt; <br clear="none" class="">&gt; 5. Use two pairs of parenthesis :<br clear="none" class="">&gt; <br clear="none" class="">&gt; .filter { ((name, age)) in age &gt;= 18 }<br clear="none" class="">&gt; <br clear="none" class="">&gt; Btw, about the 5th variant. If took what is allowed today:<br clear="none" class="">&gt; .filter { (arg: (name: String, age: Int)) in arg.age &gt;= 18 }<br clear="none" class="">&gt; , and allow type inference for tuple part arguments, we'll have this:<br clear="none" class="">&gt; .filter { (arg: (name, age)) in arg.age &gt;= 18 }<br clear="none" class="">&gt; , and if additionally allow skipping of tuple argument declaration we'll have:<br clear="none" class="">&gt; .filter { ((name, age)) in arg.age &gt;= 18 }<br clear="none" class="">&gt; I.e. two pairs for parenthesis for tuple destructuring, and such syntax is similar to<br clear="none" class="">&gt; the type this closure should have : ((String, Int)) -&gt; Bool<br clear="none" class="">&gt; <br clear="none" class="">&gt; <br clear="none" class="">&gt;&nbsp; &gt;<br clear="none" class="">&gt;&nbsp; &gt;<br clear="none" class="">&gt;&nbsp; &gt;<br clear="none" class="">&gt;&nbsp; &gt; On Thursday, June 1, 2017 12:25 PM, Vladimir.S via swift-evolution<br clear="none" class="">&gt;&nbsp; &gt; &lt;<a shape="rect" ymailto="mailto:swift-evolution@swift.org" href="mailto:swift-evolution@swift.org" class="">swift-evolution@swift.org</a> &lt;mailto:<a shape="rect" ymailto="mailto:swift-evolution@swift.org" href="mailto:swift-evolution@swift.org" class="">swift-evolution@swift.org</a>&gt;&gt; wrote:<br clear="none" class="">&gt;&nbsp; &gt;<br clear="none" class="">&gt;&nbsp; &gt;<br clear="none" class="">&gt;&nbsp; &gt; On 01.06.2017 0:42, John McCall wrote:<br clear="none" class="">&gt;&nbsp; &gt;&nbsp; &gt;&gt; On May 31, 2017, at 2:02 PM, Stephen Celis &lt;<a shape="rect" ymailto="mailto:stephen.celis@gmail.com" href="mailto:stephen.celis@gmail.com" class="">stephen.celis@gmail.com</a> <br clear="none" class="">&gt; &lt;mailto:<a shape="rect" ymailto="mailto:stephen.celis@gmail.com" href="mailto:stephen.celis@gmail.com" class="">stephen.celis@gmail.com</a>&gt;<br clear="none" class="">&gt;&nbsp; &gt; &lt;mailto:<a shape="rect" ymailto="mailto:stephen.celis@gmail.com" href="mailto:stephen.celis@gmail.com" class="">stephen.celis@gmail.com</a> &lt;mailto:<a shape="rect" ymailto="mailto:stephen.celis@gmail.com" href="mailto:stephen.celis@gmail.com" class="">stephen.celis@gmail.com</a>&gt;&gt;&gt; wrote:<br clear="none" class="">&gt;&nbsp; &gt;&nbsp; &gt;&gt;&gt; On May 28, 2017, at 7:04 PM, John McCall via swift-evolution<br clear="none" class="">&gt;&nbsp; &gt;&nbsp; &gt;&gt;&gt; &lt;<a shape="rect" ymailto="mailto:swift-evolution@swift.org" href="mailto:swift-evolution@swift.org" class="">swift-evolution@swift.org</a> &lt;mailto:<a shape="rect" ymailto="mailto:swift-evolution@swift.org" href="mailto:swift-evolution@swift.org" class="">swift-evolution@swift.org</a>&gt; <br clear="none" class="">&gt; &lt;mailto:<a shape="rect" ymailto="mailto:swift-evolution@swift.org" href="mailto:swift-evolution@swift.org" class="">swift-evolution@swift.org</a> &lt;mailto:<a shape="rect" ymailto="mailto:swift-evolution@swift.org" href="mailto:swift-evolution@swift.org" class="">swift-evolution@swift.org</a>&gt;&gt;&gt; wrote:<br clear="none" class="">&gt;&nbsp; &gt;&nbsp; &gt;&gt;&gt;<br clear="none" class="">&gt;&nbsp; &gt;&nbsp; &gt;&gt;&gt; Yes, I agree.&nbsp; We need to add back tuple destructuring in closure parameter<br clear="none" class="">&gt;&nbsp; &gt;&nbsp; &gt;&gt;&gt; lists because this is a serious usability regression.&nbsp; If we're reluctant to<br clear="none" class="">&gt;&nbsp; &gt;&nbsp; &gt;&gt;&gt; just "do the right thing" to handle the ambiguity of (a,b), we should at least<br clear="none" class="">&gt;&nbsp; &gt;&nbsp; &gt;&gt;&gt; allow it via unambiguous syntax like ((a,b)).&nbsp; I do think that we should just<br clear="none" class="">&gt;&nbsp; &gt;&nbsp; &gt;&gt;&gt; "do the right thing", however, with my biggest concern being whether there's<br clear="none" class="">&gt;&nbsp; &gt;&nbsp; &gt;&gt;&gt; any reasonable way to achieve that in 4.0.<br clear="none" class="">&gt;&nbsp; &gt;&nbsp; &gt;&gt;<br clear="none" class="">&gt;&nbsp; &gt;&nbsp; &gt;&gt; Closure parameter lists are unfortunately only half of the equation here. This<br clear="none" class="">&gt;&nbsp; &gt;&nbsp; &gt;&gt; change also regresses the usability of point-free expression.<br clear="none" class="">&gt;&nbsp; &gt;&nbsp; &gt;<br clear="none" class="">&gt;&nbsp; &gt;&nbsp; &gt; The consequences for point-free style were expected and cannot really be<br clear="none" class="">&gt;&nbsp; &gt;&nbsp; &gt; eliminated without substantially weakening SE-0110.&nbsp; Closure convenience seems to<br clear="none" class="">&gt;&nbsp; &gt;&nbsp; &gt; me to be a much more serious regression.<br clear="none" class="">&gt;&nbsp; &gt;<br clear="none" class="">&gt;&nbsp; &gt; John, do you also want to say "and without weakening SE-0066"? Because, if I<br clear="none" class="">&gt;&nbsp; &gt; understand correctly, in this case:<br clear="none" class="">&gt;&nbsp; &gt;<br clear="none" class="">&gt;&nbsp; &gt;&nbsp; &nbsp; func add(_ x: Int, _ y: Int) -&gt; Int {<br clear="none" class="">&gt;&nbsp; &gt;&nbsp; &nbsp; &nbsp; return x + y<br clear="none" class="">&gt;&nbsp; &gt;&nbsp; &nbsp; }<br clear="none" class="">&gt;&nbsp; &gt;<br clear="none" class="">&gt;&nbsp; &gt;&nbsp; &nbsp; zip([1, 2, 3], [4, 5, 6]).map(add)<br clear="none" class="">&gt;&nbsp; &gt;<br clear="none" class="">&gt;&nbsp; &gt; .. we have a clear function type mismatch situation, when map() expects function of<br clear="none" class="">&gt;&nbsp; &gt; type ((Int, Int))-&gt;Int, but function of type (Int,Int)-&gt;Int is provided ? So probably<br clear="none" class="">&gt;&nbsp; &gt; the additional 'reason' of the 'problem' in this case is SE-0066, no?<br clear="none" class="">&gt;&nbsp; &gt; Or I don't understand the SE-0066 correctly..<br clear="none" class="">&gt;&nbsp; &gt; Do we want to allow implicit conversions between function type ((Int,Int))-&gt;Int and<br clear="none" class="">&gt;&nbsp; &gt; (Int,Int)-&gt;Int?<br clear="none" class="">&gt;&nbsp; &gt;<br clear="none" class="">&gt;&nbsp; &gt; Quote from SE-0066:<br clear="none" class="">&gt;&nbsp; &gt; ---<br clear="none" class="">&gt;&nbsp; &gt; (Int, Int) -&gt; Int&nbsp; &nbsp; // function from Int and Int to Int<br clear="none" class="">&gt;&nbsp; &gt; ((Int, Int)) -&gt; Int&nbsp; // function from tuple (Int, Int) to Int<br clear="none" class="">&gt;&nbsp; &gt; ---<br clear="none" class="">&gt;&nbsp; &gt;<br clear="none" class="">&gt;&nbsp; &gt; During this discussion I see a wish of some group of developers to just return back<br clear="none" class="">&gt;&nbsp; &gt; tuple splatting for function/closure arguments, so they can freely send tuple to<br clear="none" class="">&gt;&nbsp; &gt; function/closure accepting a list of parameters(and probably vise-versa).<br clear="none" class="">&gt;&nbsp; &gt; Is it worth to follow SE-0066 and SE-0110 as is, i.e. disallow tuple deconstructing<br clear="none" class="">&gt;&nbsp; &gt; and then, as additive change improve the situation with tuple<br clear="none" class="">&gt;&nbsp; &gt; splatting/deconstructing later with separate big proposal?<br clear="none" class="">&gt;&nbsp; &gt;<br clear="none" class="">&gt;&nbsp; &gt; Btw, about the SE-0110 proposal. It was discussed, formally reviewed and accepted. I<br clear="none" class="">&gt;&nbsp; &gt; expect that its revision also should be formally proposed/reviewed/accepted to<br clear="none" class="">&gt;&nbsp; &gt; collect a wide range of opinions and thoughts, and attract the attention of<br clear="none" class="">&gt;&nbsp; &gt; developers in this list to the subject.<br clear="none" class="">&gt;&nbsp; &gt;<br clear="none" class="">&gt;&nbsp; &gt;<br clear="none" class="">&gt;&nbsp; &gt; Also, if we revisit SE-0110, will this code be allowed?:<br clear="none" class="">&gt;&nbsp; &gt;<br clear="none" class="">&gt;&nbsp; &gt; func foo(_ callback: ((Int,Int))-&gt;Void) {}<br clear="none" class="">&gt;&nbsp; &gt; let mycallback = {(x:Int, y:Int)-&gt;Void in }<br clear="none" class="">&gt;&nbsp; &gt; foo(mycallback)<br clear="none" class="">&gt;&nbsp; &gt;<br clear="none" class="">&gt;&nbsp; &gt; and<br clear="none" class="">&gt;&nbsp; &gt;<br clear="none" class="">&gt;&nbsp; &gt; func foo(_ callback: (Int,Int)-&gt;Void) {}<br clear="none" class="">&gt;&nbsp; &gt; let mycallback = {(x: (Int, Int))-&gt;Void in }<br clear="none" class="">&gt;&nbsp; &gt; foo(mycallback)<br clear="none" class="">&gt;&nbsp; &gt;<br clear="none" class="">&gt;&nbsp; &gt; If so, what will be result of this for both cases? :<br clear="none" class="">&gt;&nbsp; &gt;<br clear="none" class="">&gt;&nbsp; &gt; print(type(of:mycallback)) // (Int,Int)-&gt;Void or ((Int,Int))-&gt;Void<br clear="none" class="">&gt;&nbsp; &gt;<br clear="none" class="">&gt;&nbsp; &gt; If allowed, do we want to allow implicit conversion between types (Int,Int)-&gt;Void and<br clear="none" class="">&gt;&nbsp; &gt; ((Int,Int))-&gt;Void in both directions?&nbsp; (Hello tuple splatting?)<br clear="none" class="">&gt;&nbsp; &gt;<br clear="none" class="">&gt;&nbsp; &gt;<br clear="none" class="">&gt;&nbsp; &gt;&nbsp; &gt;<br clear="none" class="">&gt;&nbsp; &gt;&nbsp; &gt; John.<br clear="none" class="">&gt;&nbsp; &gt;&nbsp; &gt;<br clear="none" class="">&gt;&nbsp; &gt;&nbsp; &gt;<br clear="none" class="">&gt;&nbsp; &gt;&nbsp; &gt;&gt;<br clear="none" class="">&gt;&nbsp; &gt;&nbsp; &gt;&gt; func add(_ x: Int, _ y: Int) -&gt; Int { return x + y }<br clear="none" class="">&gt;&nbsp; &gt;&nbsp; &gt;&gt;<br clear="none" class="">&gt;&nbsp; &gt;&nbsp; &gt;&gt; zip([1, 2, 3], [4, 5, 6]).map(add)<br clear="none" class="">&gt;&nbsp; &gt;&nbsp; &gt;&gt;<br clear="none" class="">&gt;&nbsp; &gt;&nbsp; &gt;&gt; // error: nested tuple parameter '(Int, Int)' of function '(((_.Element,<br clear="none" class="">&gt;&nbsp; &gt;&nbsp; &gt;&gt; _.Element)) throws -&gt; _) throws -&gt; [_]' does not support destructuring<br clear="none" class="">&gt;&nbsp; &gt;&nbsp; &gt;&gt;<br clear="none" class="">&gt;&nbsp; &gt;&nbsp; &gt;&gt; This may not be a common pattern in most projects, but we heavily use this style<br clear="none" class="">&gt;&nbsp; &gt;&nbsp; &gt;&gt; in the Kickstarter app in our functional and FRP code. Definitely not the most<br clear="none" class="">&gt;&nbsp; &gt;&nbsp; &gt;&gt; common coding pattern, but a very expressive one that we rely on.<br clear="none" class="">&gt;&nbsp; &gt;&nbsp; &gt;&gt;<br clear="none" class="">&gt;&nbsp; &gt;&nbsp; &gt;&gt; Our interim solution is a bunch of overloaded helpers, e.g.:<br clear="none" class="">&gt;&nbsp; &gt;&nbsp; &gt;&gt;<br clear="none" class="">&gt;&nbsp; &gt;&nbsp; &gt;&gt; func tupleUp&lt;A, B, C&gt;(_ f: (A, B) -&gt; C) -&gt; ((A, B)) -&gt; C { return }<br clear="none" class="">&gt;&nbsp; &gt;&nbsp; &gt;&gt;<br clear="none" class="">&gt;&nbsp; &gt;&nbsp; &gt;&gt; zip([1, 2, 3], [4, 5, 6]).map(tupleUp(add))<br clear="none" class="">&gt;&nbsp; &gt;&nbsp; &gt;&gt;<br clear="none" class="">&gt;&nbsp; &gt;&nbsp; &gt;&gt; Stephen<br clear="none" class="">&gt;&nbsp; &gt;&nbsp; &gt;<br clear="none" class="">&gt;&nbsp; &gt;&nbsp; &gt; .<br clear="none" class="">&gt;&nbsp; &gt;&nbsp; &gt;<br clear="none" class="">&gt;&nbsp; &gt; _______________________________________________<br clear="none" class="">&gt;&nbsp; &gt; swift-evolution mailing list<div class="yqt9433621530" id="yqtfd45114"><br clear="none" class="">&gt;&nbsp; &gt; <a shape="rect" ymailto="mailto:swift-evolution@swift.org" href="mailto:swift-evolution@swift.org" class="">swift-evolution@swift.org</a> &lt;mailto:<a shape="rect" ymailto="mailto:swift-evolution@swift.org" href="mailto:swift-evolution@swift.org" class="">swift-evolution@swift.org</a>&gt; <br clear="none" class="">&gt; &lt;mailto:<a shape="rect" ymailto="mailto:swift-evolution@swift.org" href="mailto:swift-evolution@swift.org" class="">swift-evolution@swift.org</a> &lt;mailto:<a shape="rect" ymailto="mailto:swift-evolution@swift.org" href="mailto:swift-evolution@swift.org" class="">swift-evolution@swift.org</a>&gt;&gt;<br clear="none" class="">&gt; <br clear="none" class="">&gt;&nbsp; &gt; <a shape="rect" href="https://lists.swift.org/mailman/listinfo/swift-evolution" target="_blank" class="">https://lists.swift.org/mailman/listinfo/swift-evolution</a><br clear="none" class="">&gt;&nbsp; &gt;<br clear="none" class="">&gt;&nbsp; &gt;<br clear="none" class="">&gt; <br clear="none" class="">&gt; <br clear="none" class=""></div></div><br class=""><br class=""></div>  </div> </div>  </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=""></div></body></html>