<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="">Interesting, I have to take more time digging down. <div class=""><br class=""></div><div class="">BTW, would it not be `case .Red in “0xFF0000” ` not case .Red: “0xFF0000” since `=>` in Swiftese is `in` </div><div class=""><br class=""></div><div class=""><br class=""><div><blockquote type="cite" class=""><div class="">On 2016-01-08, at 19:58:45, Thorsten Seitz <<a href="mailto:tseitz42@icloud.com" class="">tseitz42@icloud.com</a>> wrote:</div><br class="Apple-interchange-newline"><div class=""><meta http-equiv="Content-Type" content="text/html charset=utf-8" class=""><div style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class="">That is not a feature of Scala’s map or filter functions.<div class=""><br class=""></div><div class="">Writing { case (x, y) => x + y } just defines an anonymous unary function, more specifically a partially defined function or PartialFunction (<a href="http://www.scala-lang.org/api/current/index.html#scala.PartialFunction" class="">http://www.scala-lang.org/api/current/index.html#scala.PartialFunction</a>).</div><div class=""><br class=""></div><div class="">Btw: partial functions are quite cool as they can be chained, e.g. by „orElse“ if the first function is not defined for a given input. This allows quite nice abstractions (I’m thinking or error handler functions, for example).</div><div class=""><br class=""></div><div class="">So the question is whether we would want something like that in Swift, too, i.e.</div><div class=""><br class=""></div><div class="">{ case <pattern1>: <expr1> [case <pattern2>: <expr2>]* [default: <expr>] } </div><div class="">would define a unary function which matches its input against the case patterns and returns value of the matching expression.</div><div class=""><br class=""></div><div class="">(It would probably make sense to introduce partial functions as well on top of that, i.e. make this a partial function which might even statically know that it is defined everywhere in case the compiler can check the exhaustiveness of the patterns.)</div><div class=""><br class=""></div><div class="">Then we could simply define the following function</div><div class=""><br class=""></div><div class="">func match<T,U>(x: T, f: T -> U) {</div><div class=""><span class="Apple-tab-span" style="white-space:pre">        </span>return f(x)</div><div class="">}</div><div class=""><br class=""></div><div class="">which would allow us to write a switch-expression without any further syntax extensions:</div><div class=""><br class=""></div><div class="">let value = match(color) { </div><div class=""><span class="Apple-tab-span" style="white-space:pre">        </span>case .Red: "0xFF0000“</div><div class=""><span class="Apple-tab-span" style="white-space:pre">        </span>case .Green: "0x00FF00“</div><div class=""><span class="Apple-tab-span" style="white-space:pre">        </span>case .Blue: "0x0000FF“</div><div class="">}</div><div class=""><br class=""></div><div class="">And we could also just write the map example Craig gave with no magic in the definition of map required:</div><div class=""><br class=""></div><div class="">num.map {</div><div class=""><span class="Apple-tab-span" style="white-space:pre">        </span>case x where x < 5: x + 1</div><div class=""><span class="Apple-tab-span" style="white-space:pre">        </span>case x: x - 1</div><div class="">}</div><div class=""><br class=""></div><div class=""><br class=""></div><div class="">For comparison: with my proposal of a ternary-like switch-expression this would look like follows instead:</div><div class=""><br class=""></div><div class="">num.map { elem in elem?</div><div class=""><span class="Apple-tab-span" style="white-space:pre">        </span>case x where x < 5: x + 1</div><div class=""><span class="Apple-tab-span" style="white-space: pre;">        </span>case x: x - 1</div><div class="">}</div><div class=""><br class=""></div><div class="">where we are using the switch-expression</div><div class=""><br class=""></div><div class=""><div class="">elem?</div><div class=""><span class="Apple-tab-span" style="white-space: pre;">        </span>case x where x < 5: x + 1</div><div class=""><span class="Apple-tab-span" style="white-space: pre;">        </span>case x: x - 1</div></div><div class=""><br class=""></div><div class=""><br class=""></div><div class="">But then the question arises: shouldn’t { case <pattern>: <expr> … } allow statements, too?</div><div class="">I would think so.</div><div class="">In Scala this is allowed, e.g. I can write</div><div class=""><div style="margin: 0px; line-height: normal; font-family: Monaco; color: rgb(76, 47, 45); background-color: rgb(223, 219, 196);" class="">val f: PartialFunction[Any, Int] = { case x: Int => { println(x); x + 1 } }</div></div><div class=""><br class=""></div><div class="">-Thorsten</div><div class=""><br class=""></div><div class=""><br class=""></div><div class=""><div class=""><br class=""><div class=""><blockquote type="cite" class=""><div class="">Am 08.01.2016 um 06:11 schrieb Craig Cruden via swift-evolution <<a href="mailto:swift-evolution@swift.org" class="">swift-evolution@swift.org</a>>:</div><br class="Apple-interchange-newline"><div class=""><meta http-equiv="Content-Type" content="text/html charset=utf-8" class=""><div style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class=""><div class="">I was thinking about this a bit, and was thinking that maybe we would not need a new keyword at all but just use `map` with pattern matching `case` clauses. It would mean adding `map` to individual values — or anything that we might want to use as input for matching. </div><div class=""><br class=""></div><div class="">Reference scala (section 8.5) pattern matching: <a href="http://www.scala-lang.org/docu/files/ScalaReference.pdf" class="">http://www.scala-lang.org/docu/files/ScalaReference.pdf</a></div><div class=""><br class=""></div><div class="">In scala inside `map` and `filter` (unfortunately not on things like `reduceLeft` or `foldLeft` you can specify pattern matching anonymous functions as such:</div><div class=""><br class=""></div><div class=""><div class=""><div class="">val num = List(1, 5, 7)</div><div class=""><br class=""></div><div class="">num.map {</div><div class=""> case x if x < 5 => x + 1</div><div class=""> case x => x - 1</div><div class="">}</div></div><div class=""><br class=""></div><div class="">output: List(2, 4, 6)</div><div class=""><br class=""></div><div class="">So if the pattern matching was added (I don’t believe Swift currently allows case classes in maps - but then I am rather junior in the language) Swift would not need a `match expression` it would simply be part of map and become something like:</div><div class=""><br class=""></div><div class=""><div class="" style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo;"><font color="#bb2ca2" class="">let commission = </font><span class="" style="color: rgb(79, 129, 135);">trade</span><span class="">.map {</span></div><div class="" style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo;"><span class="" style="color: rgb(187, 44, 162);"><span class="Apple-tab-span" style="white-space:pre">        </span>case</span> .Buy(<span class="" style="color: rgb(187, 44, 162);">let</span> quantity, <span class="" style="color: rgb(187, 44, 162);">let</span> price) <span class="" style="color: rgb(187, 44, 162);">where</span> <span class="" style="color: rgb(112, 61, 170);">Double</span>(quantity) * price > <span class="" style="color: rgb(39, 42, 216);">10000 in</span></div><div class="" style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo;"> <span class="Apple-tab-span" style="white-space:pre">                </span><span class="" style="color: rgb(112, 61, 170);">Double</span>(quantity) * price * <span class="" style="color: rgb(79, 129, 135);">vipCommissionRate</span> / <span class="" style="color: rgb(39, 42, 216);">100</span></div><div class="" style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo;"><span class="" style="color: rgb(187, 44, 162);"><span class="Apple-tab-span" style="white-space:pre">        </span>case</span> .Buy(<span class="" style="color: rgb(187, 44, 162);">let</span> quantity, <span class="" style="color: rgb(187, 44, 162);">let</span> price):</div><div class="" style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo;"> <span class="Apple-tab-span" style="white-space:pre">                </span><span class="" style="color: rgb(112, 61, 170);">Double</span>(quantity) * price * <span class="" style="color: rgb(79, 129, 135);">commissionRate</span> / <span class="" style="color: rgb(39, 42, 216);">100</span></div><div class="" style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo;"><span class="" style="color: rgb(187, 44, 162);"><span class="Apple-tab-span" style="white-space:pre">        </span>case</span> .Sell(<span class="" style="color: rgb(187, 44, 162);">let</span> quantity, <span class="" style="color: rgb(187, 44, 162);">let</span> price) <span class="" style="color: rgb(187, 44, 162);">where</span> <span class="" style="color: rgb(112, 61, 170);">Double</span>(quantity) * price > <span class="" style="color: rgb(39, 42, 216);">10000</span>:</div><div class="" style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo;"> <span class="Apple-tab-span" style="white-space:pre">                </span><span class="" style="color: rgb(112, 61, 170);">Double</span>(quantity) * price * <span class="" style="color: rgb(79, 129, 135);">vipCommissionRate</span> / <span class="" style="color: rgb(39, 42, 216);">100</span></div><div class="" style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo;"><span class="" style="color: rgb(187, 44, 162);"><span class="Apple-tab-span" style="white-space:pre">        </span>case</span> .Sell(<span class="" style="color: rgb(187, 44, 162);">let</span> quantity, <span class="" style="color: rgb(187, 44, 162);">let</span> price):</div><div class="" style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo;"> <span class="Apple-tab-span" style="white-space:pre">                </span><span class="" style="color: rgb(112, 61, 170);">Double</span>(quantity) * price * <span class="" style="color: rgb(79, 129, 135);">commissionRate</span> / <span class="" style="color: rgb(39, 42, 216);">100</span></div></div><div class="" style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo;"><span class="" style="color: rgb(39, 42, 216);">}</span></div><div class="" style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo;"><span class="" style="color: rgb(39, 42, 216);"><br class=""></span></div><div class="" style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo;"><span class="" style="color: rgb(39, 42, 216);"><br class=""></span></div><div class=""><span class="" style="color: rgb(39, 42, 216);"><br class=""></span></div><div class=""><br class=""></div></div><div class=""><blockquote type="cite" class=""><div class=""><div style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class=""><div class=""><br class=""></div><div class="">But if we go with brackets then I would recommend something like this: </div><div class=""><br class=""></div><div class=""><span style="color: rgb(187, 44, 162); font-family: Menlo; font-size: 11px;" class="">let </span><span style="font-family: Menlo; font-size: 11px;" class="">commission</span><span style="color: rgb(187, 44, 162); font-family: Menlo; font-size: 11px;" class=""> =</span><span class="" style="color: rgb(187, 44, 162); font-family: Menlo; font-size: 11px;"> match (</span><span style="color: rgb(79, 129, 135); font-family: Menlo; font-size: 11px;" class="">trade) </span><span style="font-family: Menlo; font-size: 11px;" class=""><font color="#bb2ca2" class="">{</font></span></div><blockquote style="margin: 0px 0px 0px 40px; border: none; padding: 0px;" class=""><div class=""><span class="" style="font-family: Menlo; font-size: 11px; color: rgb(187, 44, 162);">case</span><span style="font-family: Menlo; font-size: 11px;" class=""> </span><span style="font-family: Menlo; font-size: 11px;" class="">.Buy(</span><span class="" style="font-family: Menlo; font-size: 11px; color: rgb(187, 44, 162);">let</span><span style="font-family: Menlo; font-size: 11px;" class=""> </span><span style="font-family: Menlo; font-size: 11px;" class="">quantity,</span><span style="font-family: Menlo; font-size: 11px;" class=""> </span><span class="" style="font-family: Menlo; font-size: 11px; color: rgb(187, 44, 162);">let</span><span style="font-family: Menlo; font-size: 11px;" class=""> </span><span style="font-family: Menlo; font-size: 11px;" class="">price)</span><span style="font-family: Menlo; font-size: 11px;" class=""> </span><span class="" style="font-family: Menlo; font-size: 11px; color: rgb(187, 44, 162);">where</span><span style="font-family: Menlo; font-size: 11px;" class=""> </span><span class="" style="font-family: Menlo; font-size: 11px; color: rgb(112, 61, 170);">Double</span><span style="font-family: Menlo; font-size: 11px;" class="">(quantity) * price ></span><span style="font-family: Menlo; font-size: 11px;" class=""> </span><span class="" style="font-family: Menlo; font-size: 11px; color: rgb(39, 42, 216);">10000</span><span style="font-family: Menlo; font-size: 11px;" class="">:</span></div><div class=""><span style="font-family: Menlo; font-size: 11px;" class=""> </span><span style="font-family: Menlo; font-size: 11px;" class=""> </span><span class="" style="font-family: Menlo; font-size: 11px; color: rgb(112, 61, 170);">Double</span><span style="font-family: Menlo; font-size: 11px;" class="">(quantity) * price *</span><span style="font-family: Menlo; font-size: 11px;" class=""> </span><span class="" style="font-family: Menlo; font-size: 11px; color: rgb(79, 129, 135);">vipCommissionRate</span><span style="font-family: Menlo; font-size: 11px;" class=""> </span><span style="font-family: Menlo; font-size: 11px;" class="">/</span><span style="font-family: Menlo; font-size: 11px;" class=""> </span><span class="" style="font-family: Menlo; font-size: 11px; color: rgb(39, 42, 216);">100</span></div><div class=""><span class="" style="font-family: Menlo; font-size: 11px; color: rgb(187, 44, 162);">case</span><span style="font-family: Menlo; font-size: 11px;" class=""> </span><span style="font-family: Menlo; font-size: 11px;" class="">.Buy(</span><span class="" style="font-family: Menlo; font-size: 11px; color: rgb(187, 44, 162);">let</span><span style="font-family: Menlo; font-size: 11px;" class=""> </span><span style="font-family: Menlo; font-size: 11px;" class="">quantity,</span><span style="font-family: Menlo; font-size: 11px;" class=""> </span><span class="" style="font-family: Menlo; font-size: 11px; color: rgb(187, 44, 162);">let</span><span style="font-family: Menlo; font-size: 11px;" class=""> </span><span style="font-family: Menlo; font-size: 11px;" class="">price):</span></div><div class=""><span style="font-family: Menlo; font-size: 11px;" class=""> </span><span style="font-family: Menlo; font-size: 11px;" class=""> </span><span class="" style="font-family: Menlo; font-size: 11px; color: rgb(112, 61, 170);">Double</span><span style="font-family: Menlo; font-size: 11px;" class="">(quantity) * price *</span><span style="font-family: Menlo; font-size: 11px;" class=""> </span><span class="" style="font-family: Menlo; font-size: 11px; color: rgb(79, 129, 135);">commissionRate</span><span style="font-family: Menlo; font-size: 11px;" class=""> </span><span style="font-family: Menlo; font-size: 11px;" class="">/</span><span style="font-family: Menlo; font-size: 11px;" class=""> </span><span class="" style="font-family: Menlo; font-size: 11px; color: rgb(39, 42, 216);">100</span></div><div class=""><span class="" style="font-family: Menlo; font-size: 11px; color: rgb(187, 44, 162);">case</span><span style="font-family: Menlo; font-size: 11px;" class=""> </span><span style="font-family: Menlo; font-size: 11px;" class="">.Sell(</span><span class="" style="font-family: Menlo; font-size: 11px; color: rgb(187, 44, 162);">let</span><span style="font-family: Menlo; font-size: 11px;" class=""> </span><span style="font-family: Menlo; font-size: 11px;" class="">quantity,</span><span style="font-family: Menlo; font-size: 11px;" class=""> </span><span class="" style="font-family: Menlo; font-size: 11px; color: rgb(187, 44, 162);">let</span><span style="font-family: Menlo; font-size: 11px;" class=""> </span><span style="font-family: Menlo; font-size: 11px;" class="">price)</span><span style="font-family: Menlo; font-size: 11px;" class=""> </span><span class="" style="font-family: Menlo; font-size: 11px; color: rgb(187, 44, 162);">where</span><span style="font-family: Menlo; font-size: 11px;" class=""> </span><span class="" style="font-family: Menlo; font-size: 11px; color: rgb(112, 61, 170);">Double</span><span style="font-family: Menlo; font-size: 11px;" class="">(quantity) * price ></span><span style="font-family: Menlo; font-size: 11px;" class=""> </span><span class="" style="font-family: Menlo; font-size: 11px; color: rgb(39, 42, 216);">10000</span><span style="font-family: Menlo; font-size: 11px;" class="">:</span></div><div class=""><span style="font-family: Menlo; font-size: 11px;" class=""> </span><span style="font-family: Menlo; font-size: 11px;" class=""> </span><span class="" style="font-family: Menlo; font-size: 11px; color: rgb(112, 61, 170);">Double</span><span style="font-family: Menlo; font-size: 11px;" class="">(quantity) * price *</span><span style="font-family: Menlo; font-size: 11px;" class=""> </span><span class="" style="font-family: Menlo; font-size: 11px; color: rgb(79, 129, 135);">vipCommissionRate</span><span style="font-family: Menlo; font-size: 11px;" class=""> </span><span style="font-family: Menlo; font-size: 11px;" class="">/</span><span style="font-family: Menlo; font-size: 11px;" class=""> </span><span class="" style="font-family: Menlo; font-size: 11px; color: rgb(39, 42, 216);">100</span></div><div class=""><span class="" style="font-family: Menlo; font-size: 11px; color: rgb(187, 44, 162);">case</span><span style="font-family: Menlo; font-size: 11px;" class=""> </span><span style="font-family: Menlo; font-size: 11px;" class="">.Sell(</span><span class="" style="font-family: Menlo; font-size: 11px; color: rgb(187, 44, 162);">let</span><span style="font-family: Menlo; font-size: 11px;" class=""> </span><span style="font-family: Menlo; font-size: 11px;" class="">quantity,</span><span style="font-family: Menlo; font-size: 11px;" class=""> </span><span class="" style="font-family: Menlo; font-size: 11px; color: rgb(187, 44, 162);">let</span><span style="font-family: Menlo; font-size: 11px;" class=""> </span><span style="font-family: Menlo; font-size: 11px;" class="">price):</span></div><div class=""><div class="" style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;"><div class=""><div class="" style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo;"> <span class="" style="color: rgb(112, 61, 170);">Double</span>(quantity) * price * <span class="" style="color: rgb(79, 129, 135);">commissionRate</span> / <span class="" style="color: rgb(39, 42, 216);">100</span></div></div></div></div></blockquote><div class=""><div class="" style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;"><div class=""><div class="" style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo;"><font color="#272ad8" class="">}</font></div></div></div></div></div></div></blockquote></div><br class="">
<img src="https://u2002410.ct.sendgrid.net/wf/open?upn=1MXK54sosN3xru3iYcLt0oBZ2w20i49gyogXctgrspe7wA1knOK1HCJmiaMUpPlg12r0jwt46Yh0N0LDUsV7M0hA-2BH6rSWn24rL-2FSxCGKaF5VJNpm-2BNM1vIo7F7lX-2FsiQ3gkQt5tfCWGMmRCeSiiCJY5iKYRsCByXjMfzMeiVXpDsNTTYh-2FmailoylSKCeMvvHnzaLcauRM6m8CnOgm1zcM0RwI21HO9CsQSW8MvbUU-3D" alt="" width="1" height="1" border="0" style="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;" class="">
</div>
_______________________________________________<br class="">swift-evolution mailing list<br class=""><a href="mailto:swift-evolution@swift.org" class="">swift-evolution@swift.org</a><br class=""><a href="https://lists.swift.org/mailman/listinfo/swift-evolution" class="">https://lists.swift.org/mailman/listinfo/swift-evolution</a><br class=""></div></blockquote></div><br class=""></div></div></div></div></blockquote></div><br class=""></div></body></html>