This is a fair question, and the observation that “it can be hard to tell input arguments from nested patterns” is obviously a valid one, but this is a syntax issue. One of the reasons I deliberately chose to minimize syntax examples in my document is that I didn’t want to get distracted on this. So yes, this is a good question, there’s a good discussion to be had, but I would prefer not to have it now. I have a proposal in mind but the time is not yet right, so I have held it back.
Now, you might ask, why did I even bring up input arguments then? Because it is a critical part of the model; we are going to need patterns that take inputs (think Map::get or regex.) So it has to be on the table as something the model must support. But I don’t want to confront syntax — either use site or declaration site — yet. > On Jan 18, 2021, at 10:59 AM, Remi Forax <fo...@univ-mlv.fr> wrote: > > I think we should take a look to the difference between (sub-)patterns and > arguments of a pattern. > > If i want to test if o is a String with an integer value greater than 10, i > can write something like > switch(o) { > case String s && Integer.parseInt(s, >10) -> ... > } > > but this pseudo syntax is not a good one because it's like the argument of > the pattern (s) and the sub-pattern (>10) are both "arguments" of the pattern > Integer.parseInt. > > For the shake of the demonstration, let's use a syntax that cleanly separate > the arguments from the sub-pattern, > with the arguments in between '{' '}' and the sub-pattern in between '[' ']' > > switch(o) { > case String s && Integer.parseInt{s} [>10] -> ... > } > > I think it's important to separate the two because they don't obey the same > rules, > the arguments can be any expressions while the sub-pattern can only be a > pattern. > > By example, Foo.bar{1}[...] is valid while Foo.bar{...}[1] is not (with ... > meaning whatever works). > Because 1 is a valid argument while 1 is not a valid pattern. > > If we separate the arguments and the pattern, this has several implications > - until now, we have used parenthesis as patterns separator, but given that > we has used parenthesis for arguments since Java 1.0, > we may want to revisit the use of parenthesis for the sub-patterns > - we can also use parenthesis for both but it may be confusing. > - we may not need 'var' because it can only appear in the sub-pattern part, > may be the fact that there is a specific delimiter for that part is enough. > > Rémi