<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=""><div class=""><div class=""><b class="">Selector Operator Proposal</b></div><div class=""><br class=""></div><div class="">OK really trying to get this down to its essence, make something that is truly better and more powerful than ternary, and try to keep as much of the advantages of the ternary and hopefully slightly improve the readability. I am calling it the "selector operator". This proposal, does not add a new keyword but adds a new operator. It unifies the concepts of ternary and gives us a new switch like behavior that ternary does not support. The concept is kind of like a train track, with multiple possible directions selectable by one input.&nbsp;</div><div class=""><br class=""></div><div class="">I believe it also addresses the issues that Chris mentioned.&nbsp;</div><div class=""><br class=""></div><div class="">to select from a boolean, a or b:</div><div class=""><font face="Monaco" class="">let a = sel -&gt;&gt; true, false</font></div><div class=""><br class=""></div><div class="">to select from an enum values as in a switch:</div><div class=""><br class=""></div><div class=""><font face="Monaco" class="">let a = sel -&gt;&gt;&nbsp;</font><span style="font-family: Monaco;" class="">.Red: 1, .Green: 2, .Blue: 3&nbsp;</span></div><div class=""><font face="Monaco" class="">let b = sel -&gt;&gt; .Red: 1, .Green: 2, .Blue: 3, default: 4</font></div><div class=""><font face="Monaco" class="">let c = sel -&gt;&gt; case .Red: 1, case .Green: 2, case .Blue: 3, default: 4</font></div><div class=""><font face="Monaco" class="">let d = sel -&gt;&gt; .Red: 1, (sel -&gt;&gt; .Sun: .Yellow, .Moon: .White, .Stars: .Twinkle), .Green: 2, .Blue: 3, default: 4</font></div></div><div class=""><span style="font-family: Monaco;" class="">let e = sel -&gt;&gt; cases: .Red: 1, case .Green: 2, case .Blue: 3, default: 4</span></div><div class=""><span style="font-family: Monaco;" class=""><br class=""></span></div><div class="">a) shows all possible routes handled.</div><div class="">b) shows a default form</div><div class="">c) shows form with case (follows existing switch rules so should be familiar)</div><div class="">d) shows nested form.&nbsp;</div><div class="">e) shows a slight modification to cases label to balance the default, I think balance can be helpful. User can choose concise vs balance.&nbsp;</div><div class=""><br class=""></div><div class="">to select from an integer or any other enumerable type:</div><div class=""><br class=""></div><div class=""><font face="Monaco" class="">let f = sel -&gt;&gt; “A", “B", “C", “D”. “E”, “F”, default: “G”</font></div><div class=""><div class=""><font face="Monaco" class="">let g = sel -&gt;&gt; cases: “A", “B", “C", “D”. “E”, “F”, default: “G”</font></div></div><div class=""><br class=""></div><div class="">e) shows compact form, must have default because all integers would make for a long list.</div><div class=""><div class="">f) shows a slight modification to cases label to balance the default, I think balance can be helpful. User can choose concise vs balance.&nbsp;</div></div><div class=""><br class=""></div><div class=""><b class="">Advantages:</b></div><div class="">• This lets ? operator be used only for optionals.</div><div class="">• It pops out in code similar to the ternary operator.&nbsp;</div><div class="">• Slightly improved readability&nbsp;</div><div class="">• Unifies the switch and ternary concepts.&nbsp;</div><div class="">• No new keyword (well, cases: is a minor addition)&nbsp;</div><div class="">• new operator allows us to define how it should be formatted as there is no preconceived notion of how it should be formatted</div><div class="">• By definition it only deals in expressions.</div><div class="">• There is no way it can be confused with statements.&nbsp;</div><div class="">• the interesting syntax would keep people from doing very large expressions in it (Paraphrasing Chris)&nbsp;</div><div class="">• chains well for multiple conditions because of its associativity&nbsp;</div><div class="">• because it is a new concept there is potential to extend it in the future.&nbsp;</div><div class=""><br class=""></div><div class=""><b class="">Disadvantages:</b></div><div class="">• May be a slight improvement in readability. Operators have to be looked up if you are not familiar with them.&nbsp;</div><div class="">• New concept that will have to be learned and not present in most C like languages so needs to be learned.&nbsp;</div><div class=""><br class=""></div><div class=""><b class="">Other Half Baked thoughts:</b></div><div class="">• Are there other data types that would work with this? Maybe Objects, Dictionaries, Arrays, Ranges enumerations, or Structs (Unions?)&nbsp;</div>* What would container types look like? Could you call it multiple times on an array? Kind of like a map like behavior where each element goes into the selector operator.&nbsp;<div class=""><br class=""></div><div class="">- Paul</div><div class=""><br class=""></div><div class=""><br class=""><div><blockquote type="cite" class=""><div class="">On Dec 16, 2015, at 8:04 AM, J. Cheyo Jimenez &lt;<a href="mailto:cheyo@masters3d.com" class="">cheyo@masters3d.com</a>&gt; wrote:</div><br class="Apple-interchange-newline"><div class="">Pick is interesting but how do you chain more that one pick/from together?<div class=""><br class=""></div><div class="">I thought about just just dropping the if.</div><div class=""><br class=""></div>let result = bool then 1 else bool then 2 else 3<div class=""><br class=""></div><div class="">Or going back to the python style.&nbsp;</div><div class=""><br class=""></div><div class="">let result = 1 where bool else where bool 2 else 3<br class=""><div class=""><br class=""></div><div class="">But you are right, can't beat just having two characters. Specially when the Elvis operator is in every other major c based language.&nbsp;</div><div class=""><br class=""></div><div class="">Perhaps this is just a like ! as a negation character, once you learn the differences then u are set for other languages as well.&nbsp;</div><div class=""><br class=""></div><div class="">It would be nice to be able to bind expressions so that the actual logic of the ?: is not lost.&nbsp;</div><div class=""><br class=""></div><div class="">let result = if&nbsp;(long_boolexpresion, &nbsp; &nbsp;</div><div class="">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;longerBoolexoression,&nbsp;</div><div class="">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;anotherboolExpression&nbsp;)&nbsp;</div><div class="">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;$0 then "a"&nbsp;else $1 &amp;&amp; $2&nbsp;then "b" else "c"<span class=""></span><br class=""><div class=""><br class=""><br class="">On Tuesday, December 15, 2015, Paul Ossenbruggen via swift-evolution &lt;<a href="mailto:swift-evolution@swift.org" class="">swift-evolution@swift.org</a>&gt; wrote:<br class=""><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div style="word-wrap:break-word" class="">I think pick…from may address many of the negatives listed by Chris. with the if..then..else approach.<div class=""><br class=""></div><div class=""><blockquote type="cite" class=""><span style="float:none;display:inline!important" class="">The closest proposal I’ve seen is the “if cond then value1 else value2” syntax, however that has serious (IMO) problems:</span><br class=""></blockquote><br class=""><blockquote type="cite" class=""><span style="float:none;display:inline!important" class="">- It is substantially more verbose than ?:, so much so that it obscures the logic that was trying to be captured.&nbsp; Simple things like this become swallowed in syntax:</span><br class=""><span style="float:none;display:inline!important" class="">&nbsp;&nbsp;let x = cond ? 4 : 8</span><br class=""><span style="float:none;display:inline!important" class="">&nbsp;&nbsp;let x = if cond then 4 else 8</span><br class=""></blockquote><div class=""><br class=""></div>this suggestion would still be longer, you can’t beat 2 chars. It is shorter than if..then..else though. Not sure there are any good options that can beat the conciseness of the ternary without replacing it with more syntax.</div><div class=""><br class=""></div><div class=""><div style="word-wrap:break-word" class=""><div class=""><div style="margin:0px;line-height:normal;font-family:Menlo" class=""><span style="color:rgb(187,44,162)" class="">let</span>&nbsp;x = pick cond from <font color="#d12f1b" class="">4</font>,&nbsp;<span style="color:rgb(209,47,27)" class="">8</span></div></div></div><div class=""><div style="word-wrap:break-word" class=""><div class=""><div style="margin:0px;line-height:normal;font-family:Menlo" class=""><span style="color:rgb(209,47,27)" class=""><br class=""></span></div></div></div></div><blockquote type="cite" class=""><br class=""><span style="float:none;display:inline!important" class="">- Because it looks like an if statement, people will end up writing it like:</span><br class=""><br class=""><span style="float:none;display:inline!important" class="">let x = if cond then</span><br class=""><span style="white-space:pre-wrap" class="">        </span><span style="white-space:pre-wrap" class="">        </span><span style="float:none;display:inline!important" class="">some_long_expression</span><br class=""><span style="white-space:pre-wrap" class="">        </span><span style="float:none;display:inline!important" class="">&nbsp;&nbsp;&nbsp;else</span><br class=""><span style="white-space:pre-wrap" class="">        </span><span style="white-space:pre-wrap" class="">        </span><span style="float:none;display:inline!important" class="">some_other_long_expression</span><br class=""></blockquote><div class=""><br class=""></div><div class=""><blockquote type="cite" class=""><span style="float:none;display:inline!important" class="">&nbsp;- it only accepts expressions, not statements.&nbsp; The way it is flowed makes it look like a statement.</span><br class=""><span style="float:none;display:inline!important" class="">&nbsp;- It is now force indenting a lot, which just looks weird and isn’t precedented in Swift.</span></blockquote><br class=""></div><div class="">By having a new keyword, we can define the format and there is no prior connotation with it.&nbsp;</div><br class=""><blockquote type="cite" class=""><br class=""><span style="float:none;display:inline!important" class="">When this happens, we now have new problems:&nbsp;</span><br class=""><span style="float:none;display:inline!important" class="">&nbsp;- At a glance, it “looks” like an if statement, but it is semantically different.</span><br class=""></blockquote><div class=""><br class=""></div>Since it is a new it will always look like something that handles expressions only.&nbsp;</div><div class=""><div class=""><br class=""></div><div class="">Also this pick…from statement can be extended to handle switch expressions as well. So it is consistent way to do different expressions based upon an input.&nbsp;</div><div class=""><br class=""></div><div class="">Some downsides:&nbsp;</div><div class="">new keyword</div><div class="">no prior history with other programming languages.</div><div class=""><br class=""></div><div class=""><br class=""></div><div class=""><div class=""><blockquote type="cite" class=""><div class="">On Dec 15, 2015, at 4:31 PM, Paul Ossenbruggen &lt;<a href="javascript:_e(%7B%7D,'cvml','possen@gmail.com');" target="_blank" class="">possen@gmail.com</a>&gt; wrote:</div><br class=""><div class=""><div style="word-wrap:break-word" class="">Been thinking a bit:<div class=""><br class=""></div><div class="">Perhaps a new expression is in order. “Pick” this has a form like this. Param is a selector &nbsp;This only allows expressions&nbsp;</div><div class=""><br class=""></div><div class="">It has two forms:&nbsp;</div><div class=""><br class=""></div><div class="">To replace ternary:&nbsp;</div><div class=""><br class=""></div><div class=""><div style="margin:0px;line-height:normal;font-family:Menlo" class=""><span style="color:rgb(187,44,162)" class="">let</span>&nbsp;x = pick val from&nbsp;<span style="color:rgb(209,47,27)" class="">"abc"</span>,&nbsp;<span style="color:rgb(209,47,27)" class="">"cdef"</span></div><div style="margin:0px;line-height:normal;font-family:Menlo;min-height:14px" class=""><br class=""></div><div style="margin:0px;line-height:normal;font-family:Menlo;min-height:14px" class="">To replace switch expressions. The cases follows existing rules for switch cases.&nbsp;</div><div style="margin:0px;line-height:normal;font-family:Menlo;min-height:14px" class=""><br class=""></div><div style="margin:0px;line-height:normal;font-family:Menlo" class=""><span style="color:rgb(187,44,162)" class="">let</span>&nbsp;y = pick val from cases .Red:&nbsp;<span style="color:rgb(39,42,216)" class="">1</span>, .Green:&nbsp;<span style="color:rgb(39,42,216)" class="">2</span>, .Blue:&nbsp;<span style="color:rgb(39,42,216)" class="">3</span></div></div><div class=""><span style="color:rgb(39,42,216)" class=""><br class=""></span></div><div class="">This keeps the notion of expressions and statements quite separate. It avoids syntax confusion. It reads clear. It is fairy concise. It uses a straight forward pattern for both forms of expression.&nbsp;</div><div class=""><br class=""></div><div class="">- Paul</div><div class=""><br class=""></div><div class=""><blockquote type="cite" class=""><div class="">On Dec 15, 2015, at 2:06 PM, Charles Constant via swift-evolution &lt;<a href="javascript:_e(%7B%7D,'cvml','swift-evolution@swift.org');" target="_blank" class="">swift-evolution@swift.org</a>&gt; wrote:</div><br class=""><div class=""><div dir="ltr" class=""><div class=""><div class="">+1 bigtime for the assignment via Switch proposal</div><div class=""><br class=""></div><div class="">I think someone here made the argument, I can't remember who, that it would be confusing for beginners. I think exactly the opposite.&nbsp;</div><div class=""><br class=""></div><div class="">Once a new programmer has learned how to write a normal Switch statement, they'll be able to "leverage" the same concept and map values using the Switch assignment. Some might even try it on their on own, through experimentation, to see if it will work. It's such a pleasant experience when you try something in a language that seems consistent with what you already know, and discover "cool, it works!"</div><div class=""><br class=""></div><div class="">At the moment, the alternatives are, what, using a dict to map values? trying to shoehorn a corrsponding set of values into an enum? using the existing switch statement (pretty verbose in Swift, due to "let" scope etc)? In my own Swift code, I have encountered situations, frequently, where I wished I had an equivalent to a ternary condition that handled more than two values. Chaining multiple ternary conditions together is unreadable. This proposed Switch assignment expression would take care of that.&nbsp;</div><div class=""><br class=""></div><div class="">Definitely has my vote!</div><div class=""><br class=""></div><div class="gmail_extra"></div></div></div>
<img src="https://u2002410.ct.sendgrid.net/wf/open?upn=emrIhnP1hIf76Foxxv4NNJQX-2FWhcznESwKBSwD1MEwxiM0wxa3Eidlta26BoCkLrzEEM5gqpjcqwPHugOGYVJHSh0Cjz6WEph83xry-2BaIR0W-2BKDcO90DaStUsyF4iNqood42gQEqgflqw3Fj-2FmcGmt1jP83W0hWaer61T4MeYAxfNwGCNPrBIQq5Enp0s7XgYWXO2b1v4iMMuQ1IJj7zUuWxD2B7iN4zwx9avyCtGYo-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" class="">
_______________________________________________<br class="">swift-evolution mailing list<br class=""><a href="javascript:_e(%7B%7D,'cvml','swift-evolution@swift.org');" target="_blank" class="">swift-evolution@swift.org</a><br class=""><a href="https://lists.swift.org/mailman/listinfo/swift-evolution" target="_blank" class="">https://lists.swift.org/mailman/listinfo/swift-evolution</a><br class=""></div></blockquote></div><br class=""></div></div></blockquote></div><br class=""></div></div>
<img src="https://u2002410.ct.sendgrid.net/wf/open?upn=OWK4tSasaK2n-2FQIIcS9Ug-2FuFXG-2BJ3z6cFMLgm306hDcd45MQptT9erZgtrBVO57JH2apRT5Ssez8uGFCFFDjVaRJLoVtHp-2BQdbqU0p1LC2-2FsFfBJt2ErQHt5z5iMuJO8kAK061t99W-2FyZ-2BeXo4DWXa7fRa4jyVdL3KCuVeKLXrWfRXvdxv6jIPDZ895vHHH0ZHuChE1oCFV6BYI3o2nRp7C-2FFYvsQLgHsPH-2FzgvGefA-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" class="">
</div>
</blockquote></div></div></div>
</div></blockquote></div><br class=""></div></body></html>