So I think what you are saying is that you'd like `case` to be the distinctive prefix for "constant pattern", and use a different prefix for other kinds of patterns, such as instanceof.  The goal of doing so would be, I presume, (a) unambiguous parsing of different kinds of patterns and (b) giving the user visual clues for the _kind_ of match that follows.

Note that we'd have to mirror this into nested patterns too:

    instanceof Point(var x, case 0): ...

I like one thing and dislike one thing about this proposal.

 - Like: it gives us a way to differentiate `0` as a numeric literal from `0` as a constant pattern.  - Dislike: it is asking the user to keep track of a lot of different ways to say what they might think of as being the same things.

I think there's a way to get the "like" and leave the dislike behind, and that is, let go of `0` as a constant pattern, exception in the special "case" of traditional constant switches.  (Most of the time, outside of traditional int/string switches, constant patterns will only show up in nested position anyway.)

What I would prefer to do here is to disambiguate the constant patterns more directly.  For example, we could do this with an operator, like C# has:

    case Point(== 0, == 0): ...

where `== c` is a constant pattern that matches when the target is equal to the constant.  (This leaves room for other relational operators, such as `Foo(>= 0)`, too.)

I'm not bringing this up to discuss the _specific_ syntax proposal of using `==` (I was going to bring that up at another time), but what I'd like to put on the table is that the convention of a literal being a pattern is probably "too clever" and having a slightly fussier way to say it gives us clarity at a relatively low cost.



On 6/4/2020 5:17 AM, Remi Forax wrote:
I was reading the different tests in the pattern branch and an old idea pop up 
again in my head,
given i was not able to find a mail from me explaining it, here it is.

Currently Java only allow switch on constants, so we write
   String value = ...
   ... switch(value) {
     case "foo" -> ...
   }

The current proposed way to extend the switch syntax to match any type is
   Object value = ...
   ... switch(value) {
     case "foo" -> ...
     case String s -> ...
     default -> ...
   }

This seems to be a kind of natural extension, but it's not the only one.

Because we want to be able to support several kinds of pattern in the future, we have to be 
careful about the "selector" part, the part before -> or :, of the syntax, 
otherwise we may not be able to express all the patterns we want.
One simple solution is to use different keyword for different kind of patterns,
by example, "case" for a constant pattern, "instanceof" for the type pattern, 
"default" the default pattern, etc

using this new syntax, the same code as above will be written that way
   Object value = ...
   ... switch(value) {
     case "foo" -> ...
     instanceof String s -> ...
     default -> ...
   }

This idea allows by example to add the "when" pattern that execute an arbitrary 
boolean expression,
   var list = ...
   ... switch(value) {
     when list.contains(value) -> ...
   }

and to combines patterns
   var list = ...
   ... switch(value) {
     instanceof String s and when !s.isEmpty() -> ....
   }

regards,
Rémi

Reply via email to