[swift-evolution] ternary operator ?: suggestion

Matthew Johnson matthew at anandabits.com
Sun Dec 6 13:48:27 CST 2015


I am not a fan of this approach based on the ternary operator.  The ternary operator is already a bit of an anomaly in that all other operators are unary or binary and do not perform any control flow (beyond possibly short circuiting an autoclosure argument).

I would much rather features that perform control flow continue to use keywords, but allow them to be expressions.  

Once we have control flow expressions I would like to see the ternary operator removed from the language as it would no longer server a purpose.  Removing the ternary operator seems to fit nicely with the direction to remove some features that are carried over from C-based languages but don’t necessarily fit with the direction Swift is heading.


> On Dec 6, 2015, at 1:19 PM, Kevin Lundberg via swift-evolution <swift-evolution at swift.org> wrote:
> 
> Ostensibly, case may not be necessary if you could delimit each case on one line with something (perhaps a comma, or something else if that would not fit well within the grammar):
>  
> let thisColor = thatColor ? .Blue: .Red, .Green: .Blue, .Red: .Green, default: .Yellow
>  
> On Sun, Dec 6, 2015, at 01:57 PM, Paul Ossenbruggen via swift-evolution wrote:
>> I like this too, seems more powerful.  Also, would single line expressions be allowed?  If not would case be required for example:
>>  
>> let myFavoriteColor = yourFavoriteColor ?
>>     case .Blue: .Red
>>     case .Green: .Blue
>>     case .Red: .Green
>>     default: .Yellow
>>  
>>  
>>> On Dec 6, 2015, at 9:11 AM, Sean Heber via swift-evolution <swift-evolution at swift.org <mailto:swift-evolution at swift.org>> wrote:
>>>  
>>> I really like this train of thought. +1
>>>  
>>> l8r
>>> Sean
>>>  
>>> On Dec 6, 2015, at 11:02 AM, Alex Lew via swift-evolution <swift-evolution at swift.org <mailto:swift-evolution at swift.org>> wrote:
>>>> What if we left the if { ...} else { ... } syntax alone (as a statement), and updated the ternary expression to be a more general pattern matching expression (closer to "switch")? Something like
>>>>  
>>>> let x = condition ?
>>>>    true: "Hello"
>>>>    false: "Goodbye"
>>>>  
>>>> let x = optionalValue ?
>>>>    .Some(let unwrapped): "Hello, \(unwrapped)"
>>>>    .None: "To Whom It May Concern"
>>>>  
>>>> let myFavoriteColor = yourFavoriteColor ?
>>>>     .Blue: .Red
>>>>     .Green: .Blue
>>>>     .Red: .Green
>>>>  
>>>> let quadrant = (x, y) ?
>>>>     let (x, y) where x < 50 && y < 50: "top left"
>>>>     let (x, y) where x < 50 && y > 50: "bottom left"
>>>>     let (x, y) where x > 50 && y < 50: "top right"
>>>>     default: "bottom right"
>>>>  
>>>> The colon comes from the fact that this is sort of a light-weight expression-based "switch" statement, where each branch can only contain an expression, not a series of statements.
>>>>  
>>>> This is very similar to pattern matching expressions in languages like Haskell, ML, and Coq.
>>>>  
>>>> On Sun, Dec 6, 2015 at 11:25 AM, Thorsten Seitz<thorsten.seitz at web.de <mailto:thorsten.seitz at web.de>>wrote:
>>>>  
>>>>> Am 06.12.2015 um 01:28 schrieb Alex Lew via swift-evolution <swift-evolution at swift.org <mailto:swift-evolution at swift.org>>:
>>>>>  
>>>>> I don't think you can just get rid of the if statement in favor of an expression. You still want to be able to do this:
>>>>>  
>>>>> if (condition) {
>>>>>     funcWithSideEffectsThatReturnsInt()
>>>>> } else {
>>>>>     funcWithSideEffectsThatReturnsString()
>>>>> }
>>>>>  
>>>>> but that's not a valid expression (what is its type?).
>>>>  
>>>>  
>>>> That would actually be no problem if Swift’s type system would have union types (Ceylon has union and intersection types which are quite awesome and enable lots of nice things quite naturally, seehttp://ceylon-lang.org/documentation/1.2/tour/types/ <http://ceylon-lang.org/documentation/1.2/tour/types/>).
>>>>  
>>>> In that case the type of such an expression would just be the union of both types, which is writtenInt | Stringin Ceylon.
>>>>  
>>>>  
>>>> -Thorsten
>>>>  
>>>>  
>>>>  
>>>> 
>>>> _______________________________________________
>>>> swift-evolution mailing list
>>>> swift-evolution at swift.org <mailto:swift-evolution at swift.org>
>>>> https://lists.swift.org/mailman/listinfo/swift-evolution <https://lists.swift.org/mailman/listinfo/swift-evolution>
>>> _______________________________________________
>>> swift-evolution mailing list
>>> swift-evolution at swift.org <mailto:swift-evolution at swift.org>
>>> https://lists.swift.org/mailman/listinfo/swift-evolution <https://lists.swift.org/mailman/listinfo/swift-evolution>
>> 
>> 
>> _______________________________________________
>> swift-evolution mailing list
>> swift-evolution at swift.org <mailto:swift-evolution at swift.org>
>> https://lists.swift.org/mailman/listinfo/swift-evolution <https://lists.swift.org/mailman/listinfo/swift-evolution>
>  
> 
> _______________________________________________
> swift-evolution mailing list
> swift-evolution at swift.org
> https://lists.swift.org/mailman/listinfo/swift-evolution

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.swift.org/pipermail/swift-evolution/attachments/20151206/7ffd123c/attachment.html>


More information about the swift-evolution mailing list