<div dir="ltr">I&#39;m with Matthew/Craig.<div><br></div><div>We discussed a couple very ternary-like versions earlier in the thread, which I increasingly think are the best options.</div><div><br></div><div>The major objection to this came from Lattner, and his objection, if I have it right, is &quot;this proposal doesn&#39;t add enough functionality to justify the additional complexity/confusion&quot;</div><div><br></div><div>The sticking point, at the moment, is formulating a really persuasive argument for &quot;why we need this.&quot; If we can&#39;t do that, this proposal is dead.</div><div><br></div><div><br></div><div><br></div><div><br></div><div><br></div></div><div class="gmail_extra"><br><div class="gmail_quote">On Tue, Dec 29, 2015 at 5:38 AM, Matthew Johnson 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 dir="auto"><div><br><br>Sent from my iPad</div><span class=""><div><br>On Dec 29, 2015, at 7:28 AM, Craig Cruden via swift-evolution &lt;<a href="mailto:swift-evolution@swift.org" target="_blank">swift-evolution@swift.org</a>&gt; wrote:<br><br></div><blockquote type="cite"><div>That looks pretty ugly.  <div><br></div><div>I think the best we can hope for at this point is maybe another keyword that mirrors switch but is expression based (aka match) — leaving the ternary ? : expression as is - which is not all that bad since any if else that becomes a compound expression or more than two resultant values (chaining) quickly becomes a mess.  </div></div></blockquote><div><br></div></span><div>I agree that this is probably the best path forward at the moment.  There was a post early on showing a ternary-like switch expression.  I don&#39;t remember whether there were any specific problems with that idea or not, but if there aren&#39;t that might best route forward.</div><div><div class="h5"><br><blockquote type="cite"><div><div><br></div><div>I am not sure that even a “match” expression would be accepted at this point because there seems to be general resistance to anything more than the existing paradigm with a few functional decorations — and the way of doing things is good enough.  </div><div><br></div><div>Concurrency is also currently off the table at this point -- the fact that immutable pure functional code can theoretically be parsed into a dependance graph which would allow for out of order [within scope] parallel execution on different threads [not sure if the overhead of doing so would outweigh the benefits]…. would also not be of sufficient benefit. </div><div><br></div><div>The primary focus of Swift is a language for UI development, not server development….</div><div><br></div><div><br></div><div><div><blockquote type="cite"><div>On 2015-12-29, at 15:07:57, James Campbell 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-variant:normal;font-weight:normal;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px">What if you could wrap the existing switch statement in a closure and return a value from that closure like so</div><div style="font-family:Helvetica;font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px"><br></div><div style="font-family:Helvetica;font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px">Let value = { switch (other) {</div><div style="font-family:Helvetica;font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px">Case .Some(let value):</div><div style="font-family:Helvetica;font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px">Return value // because this is in a closure the closure will return the value not the function this is in</div><div style="font-family:Helvetica;font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px">Case .None:</div><div style="font-family:Helvetica;font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px">Return &quot;hello&quot; </div><div style="font-family:Helvetica;font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px">}}</div><div style="font-family:Helvetica;font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px"><br></div><div style="font-family:Helvetica;font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px"><br>Sent from my iPhone</div><div style="font-family:Helvetica;font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px"><br>On 29 Dec 2015, at 07:53, Howard Lovatt via swift-evolution &lt;<a href="mailto:swift-evolution@swift.org" target="_blank">swift-evolution@swift.org</a>&gt; wrote:<br><br></div><blockquote type="cite" style="font-family:Helvetica;font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px"><div><div><div style="margin:0px;line-height:normal"><font style="background-color:rgba(255,255,255,0)">You can replace the proposed statement `which` (another thread), the existing statement `?:` (this thread), and the global function `??` (which is an odd ball) with matching library methods.</font></div><div style="margin:0px;line-height:normal"><font style="background-color:rgba(255,255,255,0)"><br></font></div><div style="margin:0px;line-height:normal"><font style="background-color:rgba(255,255,255,0)">A library method is likely slower than a built in at this stage until the optimiser improves, but a library function:</font></div><div style="margin:0px;line-height:normal"><font style="background-color:rgba(255,255,255,0)"><br></font></div><div style="margin:0px;line-height:normal"><ol><li><font style="background-color:rgba(255,255,255,0)">Is documented right in the IDE including code completion, statements aren’t (you don’t see quick help for `for`!)</font></li><li><font style="background-color:rgba(255,255,255,0)">Having a library function allows the use case to be throughly investigated. Is worth while as a language statement? What exact features are useful? EG should `which` support pattern matching, general boolean expressions, or simply be `Equatable` as shown below?</font></li><li><font style="background-color:rgba(255,255,255,0)">It is simpler to implement, maintain, and change a library function that a built-in.</font></li><li><font style="background-color:rgba(255,255,255,0)">There is no need for a keyword.</font></li></ol></div><div style="margin:0px;line-height:normal"><font style="background-color:rgba(255,255,255,0)"><br></font></div><div style="margin:0px;line-height:normal"><font style="background-color:rgba(255,255,255,0)">First `which`:</font></div><div style="margin:0px;line-height:normal"><span style="background-color:rgba(255,255,255,0)"><br></span></div><blockquote style="margin:0px 0px 0px 40px;border:none;padding:0px"><div style="margin:0px;line-height:normal"><span style="background-color:rgba(255,255,255,0)">// Alternative to introducing `which` statement</span></div><div style="margin:0px;line-height:normal;min-height:13px"><span style="background-color:rgba(255,255,255,0)"><br></span></div><div style="margin:0px;line-height:normal"><span style="background-color:rgba(255,255,255,0)">final</span></div><div style="margin:0px;line-height:normal"><span style="background-color:rgba(255,255,255,0)"><span>class</span> Which&lt;I: Equatable, R&gt; {</span></div><div style="margin:0px;line-height:normal"><span style="background-color:rgba(255,255,255,0)"><span>    </span>private</span></div><div style="margin:0px;line-height:normal"><span style="background-color:rgba(255,255,255,0)">    <span>var</span> result: <span>R</span>?</span></div><p style="margin:0px;line-height:normal;min-height:13px"><span style="background-color:rgba(255,255,255,0)">    </span><br></p><div style="margin:0px;line-height:normal"><span style="background-color:rgba(255,255,255,0)"><span>    </span>private</span></div><div style="margin:0px;line-height:normal"><span style="background-color:rgba(255,255,255,0)">    <span>let</span> which: <span>I</span></span></div><p style="margin:0px;line-height:normal;min-height:13px"><span style="background-color:rgba(255,255,255,0)">    </span><br></p><div style="margin:0px;line-height:normal"><span style="background-color:rgba(255,255,255,0)">    <span>init</span>(<span>_</span> which: <span>I</span>) {</span></div><div style="margin:0px;line-height:normal"><span style="background-color:rgba(255,255,255,0)">        <span>self</span>.<span>which</span> = which</span></div><div style="margin:0px;line-height:normal"><span style="background-color:rgba(255,255,255,0)">    }</span></div><p style="margin:0px;line-height:normal;min-height:13px"><span style="background-color:rgba(255,255,255,0)">    </span><br></p><div style="margin:0px;line-height:normal"><span style="background-color:rgba(255,255,255,0)">    <span>func</span> match(value: I, <span>@noescape</span> matchResult: () <span>throws</span> -&gt; R) <span>rethrows</span> -&gt; <span>Self</span> {</span></div><div style="margin:0px;line-height:normal"><span style="background-color:rgba(255,255,255,0)">        <span>if</span> <span>self</span>.<span>result</span> == <span>nil</span> &amp;&amp; <span>self</span>.<span>which</span> <span>==</span> value {</span></div><div style="margin:0px;line-height:normal"><span style="background-color:rgba(255,255,255,0)">            <span>self</span>.<span>result</span> = <span>try</span> matchResult()</span></div><div style="margin:0px;line-height:normal"><span style="background-color:rgba(255,255,255,0)">        }</span></div><div style="margin:0px;line-height:normal"><span style="background-color:rgba(255,255,255,0)"><span>        </span>return<span> </span>self</span></div><div style="margin:0px;line-height:normal"><span style="background-color:rgba(255,255,255,0)">    }</span></div><p style="margin:0px;line-height:normal;min-height:13px"><span style="background-color:rgba(255,255,255,0)">    </span><br></p><div style="margin:0px;line-height:normal"><span style="background-color:rgba(255,255,255,0)">    <span>func</span> matchDefault(<span>@noescape</span> defaultResult: () <span>throws</span> -&gt; R) <span>rethrows</span> -&gt; <span>R</span> {</span></div><div style="margin:0px;line-height:normal"><span style="background-color:rgba(255,255,255,0)">        <span>switch</span> <span>self</span>.<span>result</span> {</span></div><div style="margin:0px;line-height:normal"><span style="background-color:rgba(255,255,255,0)">        <span>case</span> .None:</span></div><div style="margin:0px;line-height:normal"><span style="background-color:rgba(255,255,255,0)">            <span>return</span> <span>try</span> defaultResult()</span></div><div style="margin:0px;line-height:normal"><span style="background-color:rgba(255,255,255,0)">        <span>case</span> .Some(<span>let</span> value):</span></div><div style="margin:0px;line-height:normal"><span style="background-color:rgba(255,255,255,0)">            <span>return</span> value</span></div><div style="margin:0px;line-height:normal"><span style="background-color:rgba(255,255,255,0)">        }</span></div><div style="margin:0px;line-height:normal"><span style="background-color:rgba(255,255,255,0)">    }</span></div><div style="margin:0px;line-height:normal"><span style="background-color:rgba(255,255,255,0)">}</span></div><div style="margin:0px;line-height:normal"><span style="background-color:rgba(255,255,255,0)"><br></span></div><div style="margin:0px;line-height:normal;min-height:13px"><span style="background-color:rgba(255,255,255,0)"><br></span></div><div style="margin:0px;line-height:normal"><span style="background-color:rgba(255,255,255,0)">// Demo</span></div><div style="margin:0px;line-height:normal"><span style="background-color:rgba(255,255,255,0)"><span>enum</span> Color {</span></div><div style="margin:0px;line-height:normal"><span style="background-color:rgba(255,255,255,0)">    <span>case</span> Red, Blue, Green</span></div><div style="margin:0px;line-height:normal"><span style="background-color:rgba(255,255,255,0)">}</span></div><div style="margin:0px;line-height:normal;min-height:13px"><span style="background-color:rgba(255,255,255,0)"><br></span></div><div style="margin:0px;line-height:normal"><span style="background-color:rgba(255,255,255,0)">// Which with a default value</span></div><div style="margin:0px;line-height:normal"><span style="background-color:rgba(255,255,255,0)"><span>let</span><span> i1 = </span><span>Which</span><span>(</span><span>Color</span><span>.</span><span>Red</span><span>) </span>// i = <a dir="ltr" href="tel:16711680" target="_blank">16711680</a></span></div><div style="margin:0px;line-height:normal"><span style="background-color:rgba(255,255,255,0)">    .<span>match</span>(.<span>Red</span>)   { <span>0xFF0000</span> }</span></div><div style="margin:0px;line-height:normal"><span style="background-color:rgba(255,255,255,0)">    .<span>match</span>(.<span>Green</span>) { <span>0x00FF00</span> }</span></div><div style="margin:0px;line-height:normal"><span style="background-color:rgba(255,255,255,0)">    .<span>match</span>(.<span>Blue</span>)  { <span>0x00000FF</span> }</span></div><div style="margin:0px;line-height:normal"><span style="background-color:rgba(255,255,255,0)"><span>    .</span>matchDefault<span>  { </span><span>0</span><span> }</span></span></div><div style="margin:0px;line-height:normal;min-height:13px"><span style="background-color:rgba(255,255,255,0)"><br></span></div><div style="margin:0px;line-height:normal"><span style="background-color:rgba(255,255,255,0)">// Which that throws an error if it defaults</span></div><div style="margin:0px;line-height:normal"><span style="background-color:rgba(255,255,255,0)"><span>let</span><span> i2: </span><span>Int</span><span>! = </span><span>Which</span><span>(</span><span>Color</span><span>.</span><span>Green</span><span>) </span>// i = <a dir="ltr" href="tel:16711680" target="_blank">16711680</a></span></div><div style="margin:0px;line-height:normal"><span style="background-color:rgba(255,255,255,0)">    .<span>match</span>(.<span>Red</span>)   { <span>0xFF0000</span> }</span></div><div style="margin:0px;line-height:normal"><span style="background-color:rgba(255,255,255,0)">    .<span>match</span>(.<span>Green</span>) { <span>0x00FF00</span> }</span></div><div style="margin:0px;line-height:normal"><span style="background-color:rgba(255,255,255,0)">    .<span>match</span>(.<span>Blue</span>)  { <span>0x00000FF</span> }</span></div><div style="margin:0px;line-height:normal"><span style="background-color:rgba(255,255,255,0)"><span>    .</span><span>matchDefault</span><span>  { </span><span>nil</span><span> }  </span>// Cant type call to fatalError as no return, hence nil and type Int! (note !)</span></div></blockquote><font style="background-color:rgba(255,255,255,0)"><div><font style="background-color:rgba(255,255,255,0)"><br></font></div>Note runtime check for default rather than static check via compiler, not as good but not a big deal most of the time. The vast majority of languages don&#39;t do a compiler check on `switch`.</font></div><div><font style="background-color:rgba(255,255,255,0)"><br>Similarly the `?:` statement can be replaced:<br><br></font><blockquote style="margin:0px 0px 0px 40px;border:none;padding:0px"><div style="margin:0px;line-height:normal"><span style="background-color:rgba(255,255,255,0)">// Replacement for `?:` operator</span></div><div style="margin:0px;line-height:normal;min-height:13px"><span style="background-color:rgba(255,255,255,0)"><br></span></div><div style="margin:0px;line-height:normal"><span style="background-color:rgba(255,255,255,0)"><span>struct</span> IfFalse&lt;R&gt; {</span></div><div style="margin:0px;line-height:normal"><span style="background-color:rgba(255,255,255,0)"><span>    </span>private</span></div><div style="margin:0px;line-height:normal"><span style="background-color:rgba(255,255,255,0)">    <span>let</span> result: <span>R</span>?</span></div><p style="margin:0px;line-height:normal;min-height:13px"><span style="background-color:rgba(255,255,255,0)">    </span><br></p><div style="margin:0px;line-height:normal"><span style="background-color:rgba(255,255,255,0)">    <span>func</span> ifFalse(<span>@noescape</span> falseResult: () <span>throws</span> -&gt; R) <span>rethrows</span> -&gt; <span>R</span> {</span></div><div style="margin:0px;line-height:normal"><span style="background-color:rgba(255,255,255,0)">        <span>switch</span> <span>self</span>.<span>result</span> {</span></div><div style="margin:0px;line-height:normal"><span style="background-color:rgba(255,255,255,0)">        <span>case</span> .None:</span></div><div style="margin:0px;line-height:normal"><span style="background-color:rgba(255,255,255,0)">            <span>return</span> <span>try</span> falseResult()</span></div><div style="margin:0px;line-height:normal"><span style="background-color:rgba(255,255,255,0)">        <span>case</span> .Some(<span>let</span> value):</span></div><div style="margin:0px;line-height:normal"><span style="background-color:rgba(255,255,255,0)">            <span>return</span> value</span></div><div style="margin:0px;line-height:normal"><span style="background-color:rgba(255,255,255,0)">        }</span></div><div style="margin:0px;line-height:normal"><span style="background-color:rgba(255,255,255,0)">    }</span></div><div style="margin:0px;line-height:normal"><span style="background-color:rgba(255,255,255,0)">}</span></div><div style="margin:0px;line-height:normal;min-height:13px"><span style="background-color:rgba(255,255,255,0)"><br></span></div><div style="margin:0px;line-height:normal"><span style="background-color:rgba(255,255,255,0)">extension<span> </span><span>Bool</span><span> {</span></span></div><div style="margin:0px;line-height:normal"><span style="background-color:rgba(255,255,255,0)">    <span>func</span> ifTrue&lt;R&gt;(<span>@noescape</span> trueResult: () <span>throws</span> -&gt; R) <span>rethrows</span> -&gt; <span>IfFalse</span>&lt;<span>R</span>&gt; {</span></div><div style="margin:0px;line-height:normal"><span style="background-color:rgba(255,255,255,0)">        <span>switch</span> <span>self</span> {</span></div><div style="margin:0px;line-height:normal"><span style="background-color:rgba(255,255,255,0)">        <span>case</span> <span>true</span>:</span></div><div style="margin:0px;line-height:normal"><span style="background-color:rgba(255,255,255,0)">            <span>return</span> <span>IfFalse</span>(result: <span>try</span> trueResult())</span></div><div style="margin:0px;line-height:normal"><span style="background-color:rgba(255,255,255,0)">        <span>case</span> <span>false</span>:</span></div><div style="margin:0px;line-height:normal"><span style="background-color:rgba(255,255,255,0)">            <span>return</span> <span>IfFalse</span>(result: <span>nil</span>)</span></div><div style="margin:0px;line-height:normal"><span style="background-color:rgba(255,255,255,0)">        }</span></div><div style="margin:0px;line-height:normal"><span style="background-color:rgba(255,255,255,0)">    }</span></div><div style="margin:0px;line-height:normal"><span style="background-color:rgba(255,255,255,0)">}</span></div><div style="margin:0px;line-height:normal"><span style="background-color:rgba(255,255,255,0)"><br></span></div><div style="margin:0px;line-height:normal;min-height:13px"><span style="background-color:rgba(255,255,255,0)"><br></span></div><div style="margin:0px;line-height:normal"><span style="background-color:rgba(255,255,255,0)">// Demo</span></div><div style="margin:0px;line-height:normal"><span style="background-color:rgba(255,255,255,0)"><span>let</span><span> sB = </span><span>true</span><span>.</span><span>ifTrue</span><span>{</span><span>&quot;True&quot;</span><span>}.</span><span>ifFalse</span><span>{</span><span>&quot;False&quot;</span><span>} </span>// &quot;True&quot; - for some reason needs {} and not () thinks () form throws</span></div></blockquote><font style="background-color:rgba(255,255,255,0)"><br></font><div style="margin:0px;line-height:normal"><font style="background-color:rgba(255,255,255,0)">Whilst the `??` operator is already a library function it is difficult to see in an expression, it gets buried, and is inconsistent in style because it is a non-mathematical operator and a symbol rather than a keyword or keyword followed by a symbol. The space either side of the `??` operator also makes it look like both arguments are of equal importance, whereas it is the left hand side that is important and the right hand side is just a catch.</font></div><font style="background-color:rgba(255,255,255,0)"><br></font><blockquote style="margin:0px 0px 0px 40px;border:none;padding:0px"><div style="margin:0px;line-height:normal"><span style="background-color:rgba(255,255,255,0)">// Replacement for `??` operator</span></div><div style="margin:0px;line-height:normal;min-height:13px"><span style="background-color:rgba(255,255,255,0)"><br></span></div><div style="margin:0px;line-height:normal"><span style="background-color:rgba(255,255,255,0)">extension<span> </span><span>Optional</span><span> {</span></span></div><div style="margin:0px;line-height:normal"><span style="background-color:rgba(255,255,255,0)">    <span>func</span> ifNil(<span>@noescape</span> nilResult: () <span>throws</span> -&gt; Wrapped) <span>rethrows</span> -&gt; <span>Wrapped</span> {</span></div><div style="margin:0px;line-height:normal"><span style="background-color:rgba(255,255,255,0)">        <span>switch</span> <span>self</span> {</span></div><div style="margin:0px;line-height:normal"><span style="background-color:rgba(255,255,255,0)">        <span>case</span> .None:</span></div><div style="margin:0px;line-height:normal"><span style="background-color:rgba(255,255,255,0)">            <span>return</span> <span>try</span> nilResult()</span></div><div style="margin:0px;line-height:normal"><span style="background-color:rgba(255,255,255,0)">        <span>case</span> .Some(<span>let</span> value):</span></div><div style="margin:0px;line-height:normal"><span style="background-color:rgba(255,255,255,0)">            <span>return</span> value</span></div><div style="margin:0px;line-height:normal"><span style="background-color:rgba(255,255,255,0)">        }</span></div><div style="margin:0px;line-height:normal"><span style="background-color:rgba(255,255,255,0)">    }</span></div><div style="margin:0px;line-height:normal"><span style="background-color:rgba(255,255,255,0)">}</span></div><div style="margin:0px;line-height:normal;min-height:13px"><span style="background-color:rgba(255,255,255,0)"><br></span></div><div style="margin:0px;line-height:normal;min-height:13px"><span style="background-color:rgba(255,255,255,0)"><br></span></div><div style="margin:0px;line-height:normal"><span style="background-color:rgba(255,255,255,0)">// Demo</span></div><div style="margin:0px;line-height:normal"><span style="background-color:rgba(255,255,255,0)"><span>let</span> o: <span>String</span>? = <span>nil</span></span></div><div style="margin:0px;line-height:normal"><span style="background-color:rgba(255,255,255,0)"><span>let</span><span> sO = </span><span>o</span><span>.</span><span>ifNil</span><span>{</span><span>&quot;Nil&quot;</span><span>} </span>// &quot;Nil&quot; - for some reason needs {} and not () thinks () form throws</span></div></blockquote><font style="background-color:rgba(255,255,255,0)"><br></font><span></span><br>Sent from my iPad</div><div><br>On 29 Dec 2015, at 4:00 AM, Thorsten Seitz via swift-evolution &lt;<a href="mailto:swift-evolution@swift.org" target="_blank">swift-evolution@swift.org</a>&gt; wrote:<br><br></div><blockquote type="cite"><div><span>No exhaustiveness checking is a serious deficiency :-(</span><br><span></span><br><span>-Thorsten</span><br><span></span><br><blockquote type="cite"><span>Am 17.12.2015 um 08:09 schrieb Brent Royal-Gordon via swift-evolution &lt;<a href="mailto:swift-evolution@swift.org" target="_blank">swift-evolution@swift.org</a>&gt;:</span><br></blockquote><blockquote type="cite"><span></span><br></blockquote><blockquote type="cite"><span>Actually, this *almost* does what you want. No @autoclosure for the values and no exhaustiveness checking, but otherwise...</span><br></blockquote><span>_______________________________________________</span><br><span>swift-evolution mailing list</span><br><span><a href="mailto:swift-evolution@swift.org" target="_blank">swift-evolution@swift.org</a></span><br><span><a href="https://lists.swift.org/mailman/listinfo/swift-evolution" target="_blank">https://lists.swift.org/mailman/listinfo/swift-evolution</a></span><br></div></blockquote><img src="https://u2002410.ct.sendgrid.net/wf/open?upn=xV0JY-2FdZMnUMvSFtZnLiBPRTDDOSQf3-2FpH33HYOlBxGuyq5t-2F3EGwb-2Fp-2FEknhUTetpoZ0Wf7T5ZvniexKcrPvo8tEDpvK-2BQtk9RzQpHso5fez-2BSQ2LDBkL9Ks5k8VGQKnbFrslKf-2FARG4G9z4e4A96v5QWrKAdGbpnbuQ8sMN5cXOOeeXx4a29EVMBG63w4wkj1yJ6CgFuVL-2FoAP9XmmlelXHKqzZkOxZtQ9xv5uowE-3D" alt="" width="1" height="1" border="0" style="min-height:1px!important;width:1px!important;border-width:0px!important;margin:0px!important;padding:0px!important"></div></blockquote><blockquote type="cite" style="font-family:Helvetica;font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px"><div><span>_______________________________________________</span><br><span>swift-evolution mailing list</span><br><span><a href="mailto:swift-evolution@swift.org" target="_blank">swift-evolution@swift.org</a></span><br><span><a href="https://lists.swift.org/mailman/listinfo/swift-evolution" target="_blank">https://lists.swift.org/mailman/listinfo/swift-evolution</a></span><br></div></blockquote><img src="https://u2002410.ct.sendgrid.net/wf/open?upn=CGU22LnxbYa2EM3wKvzuC6syQDwKa0tMs5IyT5gL1wK-2Ff2L-2FN-2B2Dw8ua-2B-2Fgt1whboccNv1eVX1m5F4BIFzMEI3GyIOUp2iAHIgKUzzY1eu0AzRTVU2AoOo79z6YmO6u1qsqgdTknQ3Xi1P5E4xQiuF8cYxHRj4NuBSxFoBfDhDwJZmP-2BMJWbW215qjimsdGEEZo84d0DmRYDrJgoYaRt3qkfARPzEvbKj6UUZkfGyhc-3D" alt="" width="1" height="1" border="0" style="font-family:Helvetica;font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px;min-height:1px!important;width:1px!important;border-width:0px!important;margin:0px!important;padding:0px!important"><span style="font-family:Helvetica;font-size:12px;font-style:normal;font-variant: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> </span>_______________________________________________</span><br style="font-family:Helvetica;font-size:12px;font-style:normal;font-variant: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-variant: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-variant: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-variant: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-variant: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-variant: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>
<img src="https://u2002410.ct.sendgrid.net/wf/open?upn=eLFMrKDT8iBxZ-2Fbnk-2BZqvSchNN-2FvYXdceA0T7VxwkAfkb833H-2FjwKnSroOp8KiGVuDGbW-2Fwy4uhqQB7om5k0KTYlkv0aLaQh3LtCBTpQGIAkonBeHlOcarih2Dn07sGJPAMVXZC2kW-2BdiaZTSIkJt2oORTsvoiZzH4OQNnHLzu-2F826VcGbJJXmjyjXS5ZGY7dQpYGr3e8V7ACfJZw-2BIRns4VMtGGFC-2BPTHsqiQJhkrE-3D" alt="" width="1" height="1" border="0" style="min-height:1px!important;width:1px!important;border-width:0!important;margin-top:0!important;margin-bottom:0!important;margin-right:0!important;margin-left:0!important;padding-top:0!important;padding-bottom:0!important;padding-right:0!important;padding-left:0!important">

</div></blockquote><blockquote type="cite"><div><span>_______________________________________________</span><br><span>swift-evolution mailing list</span><br><span><a href="mailto:swift-evolution@swift.org" target="_blank">swift-evolution@swift.org</a></span><br><span><a href="https://lists.swift.org/mailman/listinfo/swift-evolution" target="_blank">https://lists.swift.org/mailman/listinfo/swift-evolution</a></span><br></div></blockquote>
<img src="https://u2002410.ct.sendgrid.net/wf/open?upn=l3fs1g-2F466j3y5fD5Q61KddsTTCmXL0uxw3XoAMFFNjeswZ2QsLAA7lo-2BqPpRbTLjoJ82rvt2v-2Bn87lR6aYeNz60ONUxs7QNBYb0HW886jvPrtFmi0GJSdhcZA5xtT5ospyqZAKc9v-2BOB1hjYU1hRol-2BhovdQI9kxKyGcqW5OiBc1-2BVOxa3FAGhSQ-2BE7gUiaddAO7DLbbLWyI38yRrt0QSAE7nvBGuNlucBQM-2FViNyE-3D" alt="" width="1" height="1" border="0" style="min-height:1px!important;width:1px!important;border-width:0!important;margin-top:0!important;margin-bottom:0!important;margin-right:0!important;margin-left:0!important;padding-top:0!important;padding-bottom:0!important;padding-right:0!important;padding-left:0!important">
</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>