<div dir="ltr"><div>It&#39;s better, but it still seems a bit dry to me. I tried rewriting the beginning. Is it better to start off like this?</div><div><br></div><blockquote style="margin:0 0 0 40px;border:none;padding:0px"><div><div><i>We are proposing a new “map” method. It directly addresses a “mapping” problem that pops up in almost all Swift programs, and currently has no elegant solution. The syntax we propose makes Swift code easier to read, easier to write, and less buggy.</i></div></div><div><div><i><br></i></div></div><div><div><i>Here is an example of the problem, where we want to assign a string mapped to an enum case:</i></div></div><div><div><i><br></i></div></div><div><div><i><span class="" style="white-space:pre">        </span>let str:String</i></div></div><div><div><span class="" style="white-space:pre"><i>        </i></span></div></div><div><div><i><span class="" style="white-space:pre">        </span>switch state {</i></div></div><div><div><i><span class="" style="white-space:pre">        </span>case .Cold: </i></div></div><div><div><i><span class="" style="white-space:pre">                </span>str = “Too cold”</i></div></div><div><div><i><span class="" style="white-space:pre">        </span>case .Hot: </i></div></div><div><div><i><span class="" style="white-space:pre">                </span>str = “Too hot”</i></div></div><div><div><i><span class="" style="white-space:pre">        </span>default: </i></div></div><div><div><i><span class="" style="white-space:pre">                </span>str = “Just right”</i></div></div><div><div><i><span class="" style="white-space:pre">        </span>}</i></div></div><div><div><i><br></i></div></div><div><div><i>The syntax above does not elegantly express our intent. The “switch” statement is designed for “flow control”, but aside from choosing a single value, our example needs no “flow control”. Moreover, the ability to execute unrelated statements inside the “switch” encourages buggy code. Use of the “switch” statement for this task leads to bloated, confusing, error-prone code.</i></div></div></blockquote><div><br></div><div>Do you like it? It&#39;s all pretty subjective, I suppose.</div><div><br></div><div class="gmail_extra"><br><div class="gmail_quote">On Sat, Jan 16, 2016 at 8:51 PM, Craig Cruden <span dir="ltr">&lt;<a href="mailto:ccruden@novafore.com" target="_blank">ccruden@novafore.com</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"><div style="word-wrap:break-word">Forgot to include the link so people don’t need to search:<div><br></div><div><a href="https://github.com/cacruden/swift-evolution/blob/master/proposals/0000-Pattern-Matching-Partial-Function.md" target="_blank">https://github.com/cacruden/swift-evolution/blob/master/proposals/0000-Pattern-Matching-Partial-Function.md</a></div><div><div class="h5"><div><br></div><div><br><div><blockquote type="cite"><div>On 2016-01-17, at 11:43:39, Craig Cruden &lt;<a href="mailto:ccruden@novafore.com" target="_blank">ccruden@novafore.com</a>&gt; wrote:</div><br><div><div style="word-wrap:break-word">Updated the the motivation clause - not sure I am 100% there yet - but hopefully closer.  <div><br></div><div>As well as a few minor updates to things like let on reduce example and clarifying that the partial closures can use the optional return keyword.</div><div><br></div><div><br><div><blockquote type="cite"><div>On 2016-01-15, at 4:16:56, Charles Constant &lt;<a href="mailto:charles@charlesism.com" target="_blank">charles@charlesism.com</a>&gt; wrote:</div><br><div><div dir="ltr">Hi Craig,<div><br></div><div>Well done, what you wrote looks pretty good to me. I had no trouble understanding the proposal. It&#39;s a good length, too - I think the shorter we can make it, the more appealing it is. </div><div><br></div><div>The only section that I think needs improvement is &quot;Motivation.&quot; I think we could sell it better. I know when I&#39;ve read some of the other proposals, I do it in fairly cursory way.</div><div>&quot;Motivation&quot; could be clearer for those of our peers who haven&#39;t followed the thread. <br></div><div><br></div><div>The motivation, from my point of view:</div><div>- the need to use a value from one domain, as a &quot;key&quot; to another is very common. The ternary is a special case of this, and for all it&#39;s flaws, it&#39;s a very popular expression in multiple languages  </div><div>- using the existing &quot;switch&quot; to do this is bloated (more so in Swift because you have to declare the variable before the switch statement)</div><div>- using the existing &quot;switch&quot; to do this is less safe, because unrelated code can be inserted in the case statements<br></div><div>- current alternatives to &quot;switch&quot; aren&#39;t good (e.g.: using a Dict has quirks that add the cognitive load)</div><div>- this new &quot;map&quot; method can make code less verbose, easier to read, and safer</div><div><br></div><div><br></div><div><br></div><div><br></div><div><br></div><div><br></div><div><br></div><div><br></div><div><br></div><div><br></div><div><br></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 Thu, Jan 14, 2016 at 11:23 AM, Craig Cruden <span dir="ltr">&lt;<a href="mailto:ccruden@novafore.com" target="_blank">ccruden@novafore.com</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"><div style="word-wrap:break-word"><div>Paul, </div><div><br></div>I tried to put my understanding on the latest proposal option into a draft on github (instead of my usual BitBucket repo).  <div><br></div><div>Take a look at it and see if there is anything useable.</div><div><br></div><div><a href="https://github.com/cacruden/swift-evolution/blob/master/proposals/0000-Pattern-Matching-Partial-Function.md" target="_blank">https://github.com/cacruden/swift-evolution/blob/master/proposals/0000-Pattern-Matching-Partial-Function.md</a></div><span><font color="#888888"><div><br></div><div>Craig</div></font></span><div><div><div><br><div><blockquote type="cite"><div>On 2016-01-11, at 14:17:09, Craig Cruden &lt;<a href="mailto:ccruden@novafore.com" target="_blank">ccruden@novafore.com</a>&gt; wrote:</div><br><div><div style="word-wrap:break-word">Ignore the last comment - tired and mistaken. :p<div><br></div><div><br><div><blockquote type="cite"><div>On 2016-01-11, at 14:16:01, Craig Cruden &lt;<a href="mailto:ccruden@novafore.com" target="_blank">ccruden@novafore.com</a>&gt; wrote:</div><br><div><div style="word-wrap:break-word">I just realized “cases” probably is not needed - if it see’s a comma after case but before “:” then it is the concise form.  <div><br></div><div>If the switch / case can do that , the partial function case should be able to do the same thing.</div><div><br></div><div><br><div><blockquote type="cite"><div>On 2016-01-11, at 13:23:19, Craig Cruden &lt;<a href="mailto:ccruden@novafore.com" target="_blank">ccruden@novafore.com</a>&gt; wrote:</div><br><div><div style="word-wrap:break-word"><div>I have thought about it a bit more and I think this would cover all the cases that interest me (in addition to others needs for a little more conciseness on the most simple case).  </div><div><br></div><div>I also think we need to be clear that the “case” (or cases) and “default” are is really just a partial function which in it’s entirety is really just a complete function for used wherever a complete function (exhaustive) can be passed (e.g. reduce, filter, etc.) - otherwise they might get confused on why we are adding it to “map”.  </div><div><br></div><div>The optional where clause should also be part of the case clause as part of the proposal.  </div><div><br></div><div>There would be no need for statement based “fallthrough”.</div><div><br></div><div>You mentioned your proposal….  have you drafted a formal proposal draft?</div><div><br></div><div><br></div><br><div><blockquote type="cite"><div>On 2016-01-10, at 12:41:03, Paul Ossenbruggen via swift-evolution &lt;<a href="mailto:swift-evolution@swift.org" target="_blank">swift-evolution@swift.org</a>&gt; wrote:</div><br><div>I agree that it would be really useful to keep things concise. I am going to suggest again an idea I had in the past, it is also in my proposal, which might work well for this problem. This might address the verbosity of the “case” and at the same time make it obvious we are dealing with a switch expression. So both would be valid: <div><br></div><div><div><div dir="ltr"><div style="word-wrap:break-word"><div dir="ltr"><div style="word-wrap:break-word"><div dir="ltr"><div style="font-size:13px;margin:0px;line-height:normal;font-family:Arial"><b><div dir="ltr" style="font-family:Helvetica;font-size:12px;font-weight:normal"><div style="word-wrap:break-word"><div dir="ltr"><div style="word-wrap:break-word"><div dir="ltr"><b style="font-family:Arial;font-size:13px"><b><span style="color:rgb(96,96,96);white-space:pre-wrap">        </span><font color="#006d8f">let</font></b><b style="color:rgb(96,96,96)"> num = color.</b><font color="#008cb4">map </font>{</b></div></div></div></div></div></b></div></div></div></div></div></div></div></div></div></blockquote><blockquote type="cite"><b style="font-family:Arial;font-size:13px"><b style="color:rgb(96,96,96)"><span style="white-space:pre-wrap">        </span></b><b><span style="white-space:pre-wrap"><font color="#606060">        </font><font color="#006d8f">cases</font><font color="#606060">   </font></span></b><b><font color="#4f7a28">.Red:</font></b><b style="color:rgb(227,36,0)"> </b><b style="color:rgb(96,96,96)">100,</b><b style="color:rgb(96,96,96)"> </b></b><br><b style="font-family:Arial;font-size:13px"><b style="color:rgb(96,96,96)"><span style="white-space:pre-wrap">        </span></b><b><span style="white-space:pre-wrap"><font color="#606060">        <span style="white-space:pre-wrap">        </span>     </font><font color="#4f7a28">.</font></span></b><b><font color="#4f7a28">Green: </font></b><span> </span><b style="color:rgb(96,96,96)">200</b><b><font color="#e32400">,</font></b><b style="color:rgb(96,96,96)"> </b></b><br><b style="font-family:Arial;font-size:13px"><b style="color:rgb(96,96,96)"><span style="white-space:pre-wrap">        </span></b><b style="color:rgb(96,96,96)"><span style="white-space:pre-wrap">        <span style="white-space:pre-wrap">        </span>     </span></b><b><font color="#4f7a28">.Blue</font><font color="#e32400">: </font></b><b style="color:rgb(96,96,96)">300</b></b><br><b style="font-family:Arial;font-size:13px"><b style="color:rgb(96,96,96)"><span style="white-space:pre-wrap">        </span></b><b><span style="white-space:pre-wrap"><font color="#606060">        </font><font color="#006d8f">default</font></span></b><b style="color:rgb(227,36,0)">: </b><b style="color:rgb(96,96,96)">-1</b><b style="color:rgb(227,36,0)"> </b></b><br><b style="font-family:Arial;font-size:13px"><span style="color:rgb(227,36,0);white-space:pre-wrap">        </span>}</b><br><b style="font-family:Arial;font-size:13px"><b><span style="color:rgb(96,96,96);white-space:pre-wrap">        </span><font color="#006d8f">let</font></b><b style="color:rgb(96,96,96)"> num = color.</b><b><font color="#008cb4">map </font>{</b></b><br><b style="font-family:Arial;font-size:13px"><b style="color:rgb(96,96,96)"><span style="white-space:pre-wrap">        </span></b><b><span style="white-space:pre-wrap"><font color="#606060">        </font><font color="#006d8f">case</font><font color="#606060">     </font></span></b><b><font color="#4f7a28">.Red:</font></b><b style="color:rgb(227,36,0)"> </b><b style="color:rgb(96,96,96)">100</b></b><br><b style="font-family:Arial;font-size:13px"><b style="color:rgb(96,96,96)"><span style="white-space:pre-wrap">        </span></b><b><span style="white-space:pre-wrap"><font color="#606060">        </font><font color="#006d8f">case   </font><font color="#606060">  </font><font color="#4f7a28">.</font></span></b><b><font color="#4f7a28">Green: </font></b><span style="font-family:Helvetica"> </span><b style="color:rgb(96,96,96)">200</b><b style="color:rgb(96,96,96)"> </b></b><br><b style="font-family:Arial;font-size:13px"><b style="color:rgb(96,96,96)"><span style="white-space:pre-wrap">        </span></b><b><span style="white-space:pre-wrap"><font color="#606060">        </font><font color="#006d8f">case</font><font color="#606060">     </font></span></b><b><font color="#4f7a28">.Blue</font><font color="#e32400">: </font></b><b style="color:rgb(96,96,96)">300</b></b><br><b style="font-family:Arial;font-size:13px"><b style="color:rgb(96,96,96)"><span style="white-space:pre-wrap">        </span></b><b><span style="white-space:pre-wrap"><font color="#606060">        </font><font color="#006d8f">default</font></span></b><b style="color:rgb(227,36,0)">: </b><b style="color:rgb(96,96,96)">-1</b><b style="color:rgb(227,36,0)"> </b></b><br><div style="word-wrap:break-word"><div><div><div><div><div style="word-wrap:break-word"><div><div><div><div><div><div><div><div style="word-wrap:break-word"><div><div><div><div dir="ltr"><div style="word-wrap:break-word"><div dir="ltr"><div style="word-wrap:break-word"><div dir="ltr"><div style="font-size:13px;margin:0px;line-height:normal;font-family:Arial"><b><span style="color:rgb(227,36,0);white-space:pre-wrap">        </span>}</b></div><div><b><br></b></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></blockquote></div><br></div></div></blockquote></div><br></div></div></div></blockquote></div><br></div></div></div></blockquote></div><br></div></div></div></div></blockquote></div><br></div>
</div></blockquote></div><br></div></div></div></blockquote></div><br></div></div></div></div></blockquote></div><br></div></div>