<div dir="ltr"><div class="markdown-here-wrapper" style=""><p style="margin:0px 0px 1.2em!important">You can process lists using pattern matching today:</p>
<pre style="font-size:0.85em;font-family:Consolas,Inconsolata,Courier,monospace;font-size:1em;line-height:1.2em;margin:1.2em 0px"><code class="hljs language-swift" style="font-size:0.85em;font-family:Consolas,Inconsolata,Courier,monospace;margin:0px 0.15em;padding:0px 0.3em;white-space:pre-wrap;border:1px solid rgb(234,234,234);border-radius:3px;display:inline;background-color:rgb(248,248,248);white-space:pre;overflow:auto;border-radius:3px;border:1px solid rgb(204,204,204);padding:0.5em 0.7em;display:block!important;display:block;overflow-x:auto;padding:0.5em;color:rgb(51,51,51);background:rgb(248,248,248)"><span class="hljs-class"><span class="hljs-keyword" style="color:rgb(51,51,51);font-weight:bold">enum</span> <span class="hljs-title" style="color:rgb(153,0,0);font-weight:bold;color:rgb(68,85,136);font-weight:bold">List</span>&lt;<span class="hljs-title" style="color:rgb(153,0,0);font-weight:bold;color:rgb(68,85,136);font-weight:bold">T</span>&gt; </span>{
    <span class="hljs-keyword" style="color:rgb(51,51,51);font-weight:bold">case</span> <span class="hljs-type" style="color:rgb(68,85,136);font-weight:bold">Nil</span>
    indirect <span class="hljs-keyword" style="color:rgb(51,51,51);font-weight:bold">case</span> <span class="hljs-type" style="color:rgb(68,85,136);font-weight:bold">Cons</span>(<span class="hljs-type" style="color:rgb(68,85,136);font-weight:bold">T</span>, <span class="hljs-type" style="color:rgb(68,85,136);font-weight:bold">List</span>&lt;<span class="hljs-type" style="color:rgb(68,85,136);font-weight:bold">T</span>&gt;)
}

<span class="hljs-keyword" style="color:rgb(51,51,51);font-weight:bold">let</span> list: <span class="hljs-type" style="color:rgb(68,85,136);font-weight:bold">List</span>&lt;<span class="hljs-type" style="color:rgb(68,85,136);font-weight:bold">Int</span>&gt; = .<span class="hljs-type" style="color:rgb(68,85,136);font-weight:bold">Cons</span>(<span class="hljs-number" style="color:rgb(0,128,128)">2</span>, .<span class="hljs-type" style="color:rgb(68,85,136);font-weight:bold">Cons</span>(<span class="hljs-number" style="color:rgb(0,128,128)">3</span>, .<span class="hljs-type" style="color:rgb(68,85,136);font-weight:bold">Nil</span>))

<span class="hljs-keyword" style="color:rgb(51,51,51);font-weight:bold">switch</span> list {
    <span class="hljs-keyword" style="color:rgb(51,51,51);font-weight:bold">case</span> .<span class="hljs-type" style="color:rgb(68,85,136);font-weight:bold">Nil</span>: ...
    <span class="hljs-keyword" style="color:rgb(51,51,51);font-weight:bold">case</span> .<span class="hljs-type" style="color:rgb(68,85,136);font-weight:bold">Cons</span>(<span class="hljs-keyword" style="color:rgb(51,51,51);font-weight:bold">let</span> x, .<span class="hljs-type" style="color:rgb(68,85,136);font-weight:bold">Nil</span>): ...
    <span class="hljs-keyword" style="color:rgb(51,51,51);font-weight:bold">case</span> .<span class="hljs-type" style="color:rgb(68,85,136);font-weight:bold">Cons</span>(<span class="hljs-keyword" style="color:rgb(51,51,51);font-weight:bold">let</span> x, .<span class="hljs-type" style="color:rgb(68,85,136);font-weight:bold">Cons</span>(<span class="hljs-keyword" style="color:rgb(51,51,51);font-weight:bold">let</span> y, .<span class="hljs-type" style="color:rgb(68,85,136);font-weight:bold">Nil</span>)): ...
    <span class="hljs-keyword" style="color:rgb(51,51,51);font-weight:bold">default</span>: handleLongList(list)
}
</code></pre>
<p style="margin:0px 0px 1.2em!important">The thing is, such lists are not idiomatic in Swift. Pattern matching on <code style="font-size:0.85em;font-family:Consolas,Inconsolata,Courier,monospace;margin:0px 0.15em;padding:0px 0.3em;white-space:pre-wrap;border:1px solid rgb(234,234,234);border-radius:3px;display:inline;background-color:rgb(248,248,248)">Array</code> also kind-of works:</p>
<pre style="font-size:0.85em;font-family:Consolas,Inconsolata,Courier,monospace;font-size:1em;line-height:1.2em;margin:1.2em 0px"><code class="hljs language-swift" style="font-size:0.85em;font-family:Consolas,Inconsolata,Courier,monospace;margin:0px 0.15em;padding:0px 0.3em;white-space:pre-wrap;border:1px solid rgb(234,234,234);border-radius:3px;display:inline;background-color:rgb(248,248,248);white-space:pre;overflow:auto;border-radius:3px;border:1px solid rgb(204,204,204);padding:0.5em 0.7em;display:block!important;display:block;overflow-x:auto;padding:0.5em;color:rgb(51,51,51);background:rgb(248,248,248)"><span class="hljs-keyword" style="color:rgb(51,51,51);font-weight:bold">let</span> array: <span class="hljs-type" style="color:rgb(68,85,136);font-weight:bold">Array</span>&lt;<span class="hljs-type" style="color:rgb(68,85,136);font-weight:bold">Int</span>&gt; = ...

<span class="hljs-keyword" style="color:rgb(51,51,51);font-weight:bold">switch</span> array.first {
    <span class="hljs-keyword" style="color:rgb(51,51,51);font-weight:bold">case</span> .some(<span class="hljs-keyword" style="color:rgb(51,51,51);font-weight:bold">let</span> first):
        processHead(first)
        processTail(array.<span class="hljs-built_in" style="color:rgb(0,134,179)">dropFirst</span>())
    <span class="hljs-keyword" style="color:rgb(51,51,51);font-weight:bold">case</span> .<span class="hljs-keyword" style="color:rgb(51,51,51);font-weight:bold">none</span>:
        handleNil()
}
</code></pre>
<p style="margin:0px 0px 1.2em!important">Again, it’s not the most idiomatic way to do this in Swift. Also, there is no guaranteed tail-call optimization.</p>
<p style="margin:0px 0px 1.2em!important">2016-09-06 17:48 GMT+03:00 Jean-Denis Muys via swift-evolution &lt;<a href="mailto:swift-evolution@swift.org" target="_blank">swift-evolution@swift.org</a>&gt;:</p>
<p style="margin:0px 0px 1.2em!important"></p><div class="markdown-here-exclude"><p></p><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div style="word-wrap:break-word">Hello,<div><br></div><div>I would like to suggest an additive evolution to Swift that might be in scope of phase 1 of Swift 4 (because it might have an impact on the ABI).</div><div><br></div><div>The idea is to extend the pattern matching abilities of Swift to enable a recursive programming style that’s very common in languages such as Lisp, ML, or Prolog on a collection that is processed as a list. By analogy to ML, Swift could do that on tuples, or on arrays, or on any similar, perhaps new, data type. This would allow the following for example:</div></div></blockquote><p></p></div><p style="margin:0px 0px 1.2em!important"></p>
<div title="MDH:WW91IGNhbiBwcm9jZXNzIGxpc3RzIHVzaW5nIHBhdHRlcm4gbWF0Y2hpbmcgdG9kYXk6PGRpdj48
YnI+PC9kaXY+PGRpdj5gYGBzd2lmdDwvZGl2PjxkaXY+ZW51bSBMaXN0Jmx0O1QmZ3Q7IHs8L2Rp
dj48ZGl2PiZuYnNwOyAmbmJzcDsgY2FzZSBOaWw8L2Rpdj48ZGl2PiZuYnNwOyAmbmJzcDsgaW5k
aXJlY3QgY2FzZSBDb25zKFQsIExpc3QmbHQ7VCZndDspPC9kaXY+PGRpdj59PC9kaXY+PGRpdj48
YnI+PC9kaXY+PGRpdj5sZXQgbGlzdDogTGlzdCZsdDtJbnQmZ3Q7ID0gLkNvbnMoMiwgLkNvbnMo
MywgLk5pbCkpPC9kaXY+PGRpdj48YnI+PC9kaXY+PGRpdj5zd2l0Y2ggbGlzdCB7PC9kaXY+PGRp
dj4mbmJzcDsgJm5ic3A7IGNhc2UgLk5pbDogLi4uPC9kaXY+PGRpdj4mbmJzcDsgJm5ic3A7IGNh
c2UgLkNvbnMobGV0IHgsIC5OaWwpOiAuLi48L2Rpdj48ZGl2PiZuYnNwOyAmbmJzcDsgY2FzZSAu
Q29ucyhsZXQgeCwgLkNvbnMobGV0IHksIC5OaWwpKTogLi4uPC9kaXY+PGRpdj4mbmJzcDsgJm5i
c3A7IGRlZmF1bHQ6IGhhbmRsZUxvbmdMaXN0KGxpc3QpPC9kaXY+PGRpdj59PC9kaXY+PGRpdj5g
YGA8L2Rpdj48ZGl2Pjxicj48L2Rpdj48ZGl2PlRoZSB0aGluZyBpcywgc3VjaCBsaXN0cyBhcmUg
bm90IGlkaW9tYXRpYyBpbiBTd2lmdC4gUGF0dGVybiBtYXRjaGluZyBvbiBgQXJyYXlgIGFsc28g
a2luZC1vZiB3b3Jrczo8L2Rpdj48ZGl2Pjxicj48L2Rpdj48ZGl2PmBgYHN3aWZ0PC9kaXY+PGRp
dj5sZXQgYXJyYXk6IEFycmF5Jmx0O0ludCZndDsgPSAuLi48L2Rpdj48ZGl2Pjxicj48L2Rpdj48
ZGl2PnN3aXRjaCBhcnJheS5maXJzdCB7PC9kaXY+PGRpdj4mbmJzcDsgJm5ic3A7IGNhc2UgLnNv
bWUobGV0IGZpcnN0KTo8L2Rpdj48ZGl2PiZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwOyBwcm9j
ZXNzSGVhZChmaXJzdCk8L2Rpdj48ZGl2PiZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwOyBwcm9j
ZXNzVGFpbChhcnJheS5kcm9wRmlyc3QoKSk8L2Rpdj48ZGl2PiZuYnNwOyAmbmJzcDsgY2FzZSAu
bm9uZTo8L2Rpdj48ZGl2PiZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwOyBoYW5kbGVOaWwoKTwv
ZGl2PjxkaXY+fTwvZGl2PjxkaXY+YGBgPC9kaXY+PGRpdj48YnI+PC9kaXY+PGRpdj5BZ2Fpbiwg
aXQncyBub3QgdGhlIG1vc3QgaWRpb21hdGljIHdheSB0byBkbyB0aGlzIGluIFN3aWZ0LiBBbHNv
LCB0aGVyZSBpcyBubyBndWFyYW50ZWVkIHRhaWwtY2FsbCBvcHRpbWl6YXRpb24uPC9kaXY+PGRp
dj48ZGl2IGNsYXNzPSJnbWFpbF9leHRyYSI+PGJyPjxkaXYgY2xhc3M9ImdtYWlsX3F1b3RlIj4y
MDE2LTA5LTA2IDE3OjQ4IEdNVCswMzowMCBKZWFuLURlbmlzIE11eXMgdmlhIHN3aWZ0LWV2b2x1
dGlvbiA8c3BhbiBkaXI9Imx0ciI+Jmx0OzxhIGhyZWY9Im1haWx0bzpzd2lmdC1ldm9sdXRpb25A
c3dpZnQub3JnIiB0YXJnZXQ9Il9ibGFuayI+c3dpZnQtZXZvbHV0aW9uQHN3aWZ0Lm9yZzwvYT4m
Z3Q7PC9zcGFuPjo8YnI+PGJsb2NrcXVvdGUgY2xhc3M9ImdtYWlsX3F1b3RlIiBzdHlsZT0ibWFy
Z2luOjAgMCAwIC44ZXg7Ym9yZGVyLWxlZnQ6MXB4ICNjY2Mgc29saWQ7cGFkZGluZy1sZWZ0OjFl
eCI+PGRpdiBzdHlsZT0id29yZC13cmFwOmJyZWFrLXdvcmQiPkhlbGxvLDxkaXY+PGJyPjwvZGl2
PjxkaXY+SSB3b3VsZCBsaWtlIHRvIHN1Z2dlc3QgYW4gYWRkaXRpdmUgZXZvbHV0aW9uIHRvIFN3
aWZ0IHRoYXQgbWlnaHQgYmUgaW4gc2NvcGUgb2YgcGhhc2UgMSBvZiBTd2lmdCA0IChiZWNhdXNl
IGl0IG1pZ2h0IGhhdmUgYW4gaW1wYWN0IG9uIHRoZSBBQkkpLjwvZGl2PjxkaXY+PGJyPjwvZGl2
PjxkaXY+VGhlIGlkZWEgaXMgdG8gZXh0ZW5kIHRoZSBwYXR0ZXJuIG1hdGNoaW5nIGFiaWxpdGll
cyBvZiBTd2lmdCB0byBlbmFibGUgYSByZWN1cnNpdmUgcHJvZ3JhbW1pbmcgc3R5bGUgdGhhdOKA
mXMgdmVyeSBjb21tb24gaW4gbGFuZ3VhZ2VzIHN1Y2ggYXMgTGlzcCwgTUwsIG9yIFByb2xvZyBv
biBhIGNvbGxlY3Rpb24gdGhhdCBpcyBwcm9jZXNzZWQgYXMgYSBsaXN0LiBCeSBhbmFsb2d5IHRv
IE1MLCBTd2lmdCBjb3VsZCBkbyB0aGF0IG9uIHR1cGxlcywgb3Igb24gYXJyYXlzLCBvciBvbiBh
bnkgc2ltaWxhciwgcGVyaGFwcyBuZXcsIGRhdGEgdHlwZS4gVGhpcyB3b3VsZCBhbGxvdyB0aGUg
Zm9sbG93aW5nIGZvciBleGFtcGxlOjwvZGl2PjwvZGl2PjwvYmxvY2txdW90ZT48L2Rpdj48L2Rp
dj48L2Rpdj4=" style="height:0;width:0;max-height:0;max-width:0;overflow:hidden;font-size:0em;padding:0;margin:0">​</div></div></div>