[swift-evolution] ternary operator ?: suggestion

Alex Lew alexl.mail+swift at gmail.com
Sat Dec 5 18:12:49 CST 2015


I believe the idea with switch is that it would be nice to be able to do
something like

// make sure we have different favorite colors
let myFavoriteColor =
switch yourFavoriteColor {
case .Red:
return .Blue
case .Green:
return .Red
case .Blue:
return .Green
}

This is useful and exists in other functional languages. For example, ML
has “case … of …”, Coq has “match…with…end”, etc.

This is similar to what you are proposing with if:

let x = if (condition) { return value } else { return otherValue }

because in both cases you are taking what is currently a statement in Swift
and enabling it to be used as an expression. (Of course, the syntax would
ideally be nicer — maybe we limit each case’s body to be a single
expression and get rid of the return keyword, for example.) Worth noting
that in both cases, the type-checker needs to ensure that the type of each
result is the same.

The semantics of what you’re now proposing — an if? binary operator that
evaluates a condition then evaluates to either nil (if false) or some value
(if true) — is slightly different. I’m not sure I love it — the general use
case would be something like “if __ then ___ else ___” and I don’t think it
reads that way. It also doesn’t allow for pattern matching (though to be
fair, neither does the ternary operator) — it could be cool to see
something like

let greeting = “Hello, \(name),” if let name = optionalName else “To Whom
It May Concern:”

-Alex

On Sat, Dec 5, 2015 at 6:28 PM, Jonathan Hull via swift-evolution <
swift-evolution at swift.org> wrote:

> I think I have a solution for the ternary part, but I am not sure I fully
> understand what is being asked for in the case of switch.  Could someone
> clarify?
>
> There is another thread which goes into the idea a little more, but the
> basic idea is that we replace the ternary operator with ‘if?'
>
> let x = value if? condition
>
>
> If condition is true, then x is value… otherwise it is nil.  You can
> combine with the nil-coalescing operator to get else and else if style
> behavior:
>
> let x = valueA if? conditionA ?? valueB if? conditionB ?? valueC
>
>
> Thanks,
> Jon
>
>
> On Dec 5, 2015, at 9:09 AM, Chris Lattner < clattner at apple.com> wrote:
>
>
> On Dec 4, 2015, at 11:43 AM, J. Cheyo Jimenez < cheyo at masters3d.com>
> wrote:
>
> I'd like some feedback from the core team to see if eliminating
> the ternary operator and replacing it with if-else is even proposal
> worthy.
>
> Some interesting code in the standard library that uses the ternary
> operator quite a bit.
>
> https://gist.github.com/masters3d/7b0c6f3653368afe4357
>
>
> FWIW, I have no love for the ternary operator (it is totally "bizarre C
> magic”), but it does solve a problem that Swift currently otherwise has no
> solution for.
>
> If you’re interested in pursuing this, then the right path forward is to
> build a holistic proposal to turn statements (like if and switch) into
> expressions.  This is subtle and requires thought, but is widely desired
> and if someone were interested in driving the design and implementation,
> then I’d be interested to see it happen.
>
> -Chris
>
> _______________________________________________
> swift-evolution mailing list
> swift-evolution at swift.org
> https://lists.swift.org/mailman/listinfo/swift-evolution
>
>
> Untracked with Trackbuster <https://trackbuster.com/?sig>
>
> _______________________________________________
> 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/20151205/ca3a3a96/attachment.html>


More information about the swift-evolution mailing list