Comments/Feature Requests regarding JEP 305: Pattern Matching

Maurizio Cimadamore maurizio.cimadamore at oracle.com
Wed Jul 5 21:03:01 UTC 2017



On 05/07/17 21:34, William Shackleford wrote:
> In addition to being more concise:
>   n is not both used as the positive part of the NegNode and as the input
> parameter.
Note that this is likely to be a bug in the original example. It is not 
possible for a pattern binding to 'shadow' a method parameter name.
> It works with classes that have more fields/methods than constructor
> arguments.
> It seems to me that is better to consistently use a single syntax style
> rather than having one for classes
> that have only one or two fields that happen to match the constructor
> arguments and another more
> general style. This is especially true given that it doesn't even seem to
> make the code more concise.
Generally what you say is true - in many cases you will be able to write 
things even without nested patterns.

It is very likely that at the very least we will add some support for 
unnamed binding (with underscore '_' ) - in the spirit of unused lambda 
parameters (see JEP 302 [1]).

But where I think you reach the end of the road with that approach is 
when matching arbitrary expressions. Let's say you want to 'simplify' an 
expression - that is, given an input expression, you want to construct 
another expression that is simpler than the one in the input, by 
recognizing things such as:

-N + N = 0
0 + N = N
0 * N = 0
1 * N = N

To recognize some of those cases, you need to build more complex 
patterns; for instance, for the first case you need a pattern like this:

case AddNode(NegNode(IntNode(var n1)), IntNode(var n2)) && n1 == n2: ...

[sidebar: '&&  n1 == n2' is what we call a _guard_ - a binary expression 
that further controls whether a pattern matches or not]

Writing something like the one above without nested patterns would be 
extremely hard - you could start by checking that the outermost 
expression is an AddNode, as in your example, but then you would still 
need 2 dynamic checks for the two nodes, and then a further dynamic 
check for accessing the guts of the NegNode. In other words, getting at 
the two int values would be extremely unpleasant and verbose w/o any 
support for nested patterns.

For simpler examples, I'm with you, simpler patterns might be just fine.

Maurizio

[1] - http://openjdk.java.net/jeps/302


More information about the amber-dev mailing list