ternary operator ?: suggestion

Date: Tue, 22 Dec 2015 10:07:26 -0800
From: Jordan Rose <jordan_rose@apple.com>
To: Thorsten Seitz <tseitz42@icloud.com>
Message-ID: <2D35F5BD-3DDF-43C3-A461-14FB65530BEF@apple.com>

I think this is a good point. We definitely want to keep the boolean
ternary operator compact for the simple cases, and that may be at
odds with a general switch expression (with multi-case pattern
match).

+1 for a compact form.

I use the boolean ternary a lot, and I'd really dislike complicating it
with keywords or expanding it into a multiline construct with cases.

Nesting is of course its main problem.

Date: Tue, 22 Dec 2015 10:53:50 -0800
From: Paul Ossenbruggen <possen@gmail.com>
Message-ID: <7C5ECA99-4527-4995-8503-215F294CCB64@gmail.com>

• it is hard to tell when a ternary begins and ends, especially when nested.

At first I liked Paul's original proposal of
  let a = ?(x == y: a, b)
but I now think something intermediate like
  let a = x == y ?(a, b)
would look better; it does take care of nesting. For more clarity one
could always write
  let a = (x == y) ?(a, b)

• It is not until you get to the question mark that you realize it is a ternary.

I think that's actually a good thing. You (or the parser) have found a
boolean expression and when the ?( appears you understand the result is
fed into a selector. Were the ? and ( separate you could consider ? as a
binary operator accepting a boolean and a 2-tuple.

Today, using ? as an operator appears not to be allowed, but
public func ??<T> (left:Bool, right: (T, T)) -> T {
  if (left) {
    return right.0
  }
  return right.1
}
already works:
  let a = (x == y) ?? (a, b)
runs as expected. Downside, no @autoclosure on tuple items.

IOW, you shouldn't be too surprised finding a binary operator after an
expression :-)

···

On 22/12/15 16:50 , swift-evolution-request@swift.org wrote:

--
Rainer Brockerhoff <rainer@brockerhoff.net>
Belo Horizonte, Brazil
"In the affairs of others even fools are wise
In their own business even sages err."

My only issue (barring any longer term plan to move toward everything being an expression) is that the question mark already has many uses in the language. If we aren’t supporting the C-style ternary operator syntax, I don’t know if there is a good reason anymore to use ‘?’ considering its heavy use around optionals.

-DW

···

On Dec 23, 2015, at 2:05 PM, Rainer Brockerhoff via swift-evolution <swift-evolution@swift.org> wrote:

On 22/12/15 16:50 , swift-evolution-request@swift.org wrote:

Date: Tue, 22 Dec 2015 10:07:26 -0800
From: Jordan Rose <jordan_rose@apple.com>
To: Thorsten Seitz <tseitz42@icloud.com>
Message-ID: <2D35F5BD-3DDF-43C3-A461-14FB65530BEF@apple.com>

I think this is a good point. We definitely want to keep the boolean
ternary operator compact for the simple cases, and that may be at
odds with a general switch expression (with multi-case pattern
match).

+1 for a compact form.

I use the boolean ternary a lot, and I'd really dislike complicating it
with keywords or expanding it into a multiline construct with cases.

Nesting is of course its main problem.

Date: Tue, 22 Dec 2015 10:53:50 -0800
From: Paul Ossenbruggen <possen@gmail.com>
Message-ID: <7C5ECA99-4527-4995-8503-215F294CCB64@gmail.com>

• it is hard to tell when a ternary begins and ends, especially when nested.

At first I liked Paul's original proposal of
  let a = ?(x == y: a, b)
but I now think something intermediate like
  let a = x == y ?(a, b)
would look better; it does take care of nesting. For more clarity one
could always write
  let a = (x == y) ?(a, b)

• It is not until you get to the question mark that you realize it is a ternary.

I think that's actually a good thing. You (or the parser) have found a
boolean expression and when the ?( appears you understand the result is
fed into a selector. Were the ? and ( separate you could consider ? as a
binary operator accepting a boolean and a 2-tuple.

Today, using ? as an operator appears not to be allowed, but
public func ??<T> (left:Bool, right: (T, T)) -> T {
  if (left) {
    return right.0
  }
  return right.1
}
already works:
  let a = (x == y) ?? (a, b)
runs as expected. Downside, no @autoclosure on tuple items.

IOW, you shouldn't be too surprised finding a binary operator after an
expression :-)

--
Rainer Brockerhoff <rainer@brockerhoff.net>
Belo Horizonte, Brazil
"In the affairs of others even fools are wise
In their own business even sages err."
Solipsism Gradient - Rainer Brockerhoff’s blog
_______________________________________________
swift-evolution mailing list
swift-evolution@swift.org
https://lists.swift.org/mailman/listinfo/swift-evolution

Hi David,

I have been using ?( as kind of a more general meaning that there is a question here not that ? is just for optionals. I am fine with using some other character or word if it expresses the idea that the expression returns one of the results based upon the control parameter. ? is kind of established for the ternary though. Any word should be very short. In the alternatives considered I talk about using if(, switch(, select( would that be preferable? I am still hoping to keep it really short though. Other than using the words as shown, i am having a hard time coming up with something that would be better than ?.

- Paul

···

On Dec 23, 2015, at 10:39 PM, David Waite via swift-evolution <swift-evolution@swift.org> wrote:

My only issue (barring any longer term plan to move toward everything being an expression) is that the question mark already has many uses in the language. If we aren’t supporting the C-style ternary operator syntax, I don’t know if there is a good reason anymore to use ‘?’ considering its heavy use around optionals.

-DW

On Dec 23, 2015, at 2:05 PM, Rainer Brockerhoff via swift-evolution <swift-evolution@swift.org> wrote:

On 22/12/15 16:50 , swift-evolution-request@swift.org wrote:

Date: Tue, 22 Dec 2015 10:07:26 -0800
From: Jordan Rose <jordan_rose@apple.com>
To: Thorsten Seitz <tseitz42@icloud.com>
Message-ID: <2D35F5BD-3DDF-43C3-A461-14FB65530BEF@apple.com>

I think this is a good point. We definitely want to keep the boolean
ternary operator compact for the simple cases, and that may be at
odds with a general switch expression (with multi-case pattern
match).

+1 for a compact form.

I use the boolean ternary a lot, and I'd really dislike complicating it
with keywords or expanding it into a multiline construct with cases.

Nesting is of course its main problem.

Date: Tue, 22 Dec 2015 10:53:50 -0800
From: Paul Ossenbruggen <possen@gmail.com>
Message-ID: <7C5ECA99-4527-4995-8503-215F294CCB64@gmail.com>

• it is hard to tell when a ternary begins and ends, especially when nested.

At first I liked Paul's original proposal of
  let a = ?(x == y: a, b)
but I now think something intermediate like
  let a = x == y ?(a, b)
would look better; it does take care of nesting. For more clarity one
could always write
  let a = (x == y) ?(a, b)

• It is not until you get to the question mark that you realize it is a ternary.

I think that's actually a good thing. You (or the parser) have found a
boolean expression and when the ?( appears you understand the result is
fed into a selector. Were the ? and ( separate you could consider ? as a
binary operator accepting a boolean and a 2-tuple.

Today, using ? as an operator appears not to be allowed, but
public func ??<T> (left:Bool, right: (T, T)) -> T {
  if (left) {
    return right.0
  }
  return right.1
}
already works:
  let a = (x == y) ?? (a, b)
runs as expected. Downside, no @autoclosure on tuple items.

IOW, you shouldn't be too surprised finding a binary operator after an
expression :-)

--
Rainer Brockerhoff <rainer@brockerhoff.net>
Belo Horizonte, Brazil
"In the affairs of others even fools are wise
In their own business even sages err."
Solipsism Gradient - Rainer Brockerhoff’s blog
_______________________________________________
swift-evolution mailing list
swift-evolution@swift.org
https://lists.swift.org/mailman/listinfo/swift-evolution

_______________________________________________
swift-evolution mailing list
swift-evolution@swift.org
https://lists.swift.org/mailman/listinfo/swift-evolution