At the same time, we also reaffirmed our choice to _not_ allow throw from one 
half of a conditional:

    int x = foo ? 3 : throw new FooException()

But John has this right — the high order bit is that every expression should 
have a defined normal completion, and a type, even if computing sub-expressions 
(or in this case, sub-statements) might throw.  And without at least one arm 
yielding a value, it would be impossible to infer the type of the expression.  

> On Mar 15, 2019, at 3:01 PM, John Rose <john.r.r...@oracle.com> wrote:
> 
> On Mar 15, 2019, at 11:39 AM, Alex Buckley <alex.buck...@oracle.com> wrote:
>> 
>> In a switch expression, I believe it should be legal for every 
>> `case`/`default` arm to complete abruptly _for a reason other than a break 
>> with value_.
> 
> My reading of Gavin's draft is that he is doing something very
> subtle there, which is to retain an existing feature in the language
> that an expression always has a defined normal completion.
> 
> We also don't have expressions of the form "throw e".  Allowing
> a switch expression to complete without a value on *every* arm
> raises the same question as "throw e" as an expression.  How do
> you type "f(throw e)"?  If you can answer that, then you can also
> have switch expressions that refuse to break with any values.
> 
> BTW, if an expression has a defined normal completion, it also
> has a possible type.  By possible type I mean at least one correct
> typing (poly-expressions can have many).  So one obvious
> result of Gavin's draft is that you derive possible types from
> the arms of the switch expression that break with values.
> 
> But the root requirement, I think, is to preserve the possible
> normal normal of every expression.
> 
> "What about some form of 1/0?"  That's a good question.
> What about it?  It completes normally with a type of int.
> Dynamically, the normal completion is never taken.
> Gavin might call that a "notional normal completion"
> (I like that word) provided to uphold the general principle
> even where static analysis proves that the Turing machine
> fails to return normally.
> 
> — John

Reply via email to