Array patterns (and varargs patterns)

John Rose john.r.rose at oracle.com
Thu Sep 8 04:41:22 UTC 2022


On 7 Jan 2021, at 6:18, Brian Goetz wrote:

> …Varargs patterns will build on it (as shown in the mail); if and 
> when Java ever gets collection literals, there will be corresponding 
> collection patterns too.  I think the path to streamlining this is 
> not to try and simplify the syntax of the primitive, but move upwards 
> to higher-level patterns.

OTOH if patterns (like `switch ((O)x) case P v:` or `let P v = (O)x`) 
are the duals of assignment (like `x = v` or `O x = v`), then we are 
within our moral rights to make a pattern dualization of the venerable 
Java syntax `T[] x = {a,b,c}`, which is sugar for `T[] x = new 
T[]{a,b,c}`.  The sugar allows you to take the second `T[]` (and the 
`new`) for a typeful context (`T[] x`).

So without the sugar we get something like:

T[] a = …;
switch (a) { case new T[]{a,b,c}: }

(The `new` from `new T[]{a,b,c}` is dropped because `new` doesn’t 
appear in patterns.)

But with the same sugar, but dualized, we get:

T[] a = …;
switch (a) { case {a,b,c}: }

In other words, when the pattern target is already an array, there is no 
need for the ceremony of repeating the array type, as with normal array 
declarations.

Likewise:

T[][] a2d = …;
switch (a2d) { case {{a,b},{c,d}}: }

I think this is what Tagir expected, and I think it is a reasonable 
“penciling out” of the basic moves of the game we are playing here.

Moving on to varargs, the context of a method call marked varargs allows 
elision not only of the `new T[]` in `new T[]{a,b,c}` but also the 
braces, you you can equally say `f(a,b,c)` or `f(new T[]{a,b,c})`.

(But not `f({a,b,c})`.  So, we don’t get `f2d({{a,b},{c,d}})` by 
analogy with nested array initializers.  Whatever.)

If a pattern-method can take a pattern-flavored argument, and perhaps a 
varargs argument to boot, it’s pretty clear that additional moves 
could follow quickly:

pattern f(pattern T[] a} { … }
pattern f2d(pattern T[][] a) { … }
pattern fv(pattern T a…) { … }
// extra “pattern” keyword on parameters for emphasis…

switch (x) {
   case f({a,b,c}): …   // omit `new T[]` b/c type
   case f2d({{d,e,f},{g}}): …   // omit `new T[][]` b/c type
   case fv(h,i,j,k): …   // omit `new T[]` and braces b/c varargs
}

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://mail.openjdk.org/pipermail/amber-spec-observers/attachments/20220907/380e9fad/attachment.htm>


More information about the amber-spec-observers mailing list