Array patterns (and varargs patterns)
Swaranga Sarma
sarma.swaranga at gmail.com
Fri Jan 8 20:32:19 UTC 2021
I am a little confused by the expression on the matcher, i.e the
Integer.parseInt(var i) - it is not clear what is happening there and I
don't think I have seen it before. Can someone explain what is being
expressed by that case label? Is it "match a String array with two elements
the second of which is a valid Integer represented as a String value"?
Here is the snippet:
switch (limitString.split(":")) {
case String[] { var _, Integer.parseInt(var i) } ->
setMultilineLimit(DEPTH, i);
case String[] { Integer.parseInt(var i) } ->
setMultilineLimit(LENGTH, i);
default -> { setMultilineLimit(DEPTH, -1);
setMultilineLimit(LENGTH, -1); }
}
Regards
Swaranga
On Wed, Jan 6, 2021 at 8:44 AM Brian Goetz <brian.goetz at oracle.com> wrote:
>
>
> > Other languages have patent matching on head and tail of lists. Adding
> > this may mean there should be additional syntax.
>
> I alluded to this in my mail, hoping that people wouldn't allow
> themselves to be distracted by this particular siren song:
>
> <digression>
> People are immediately going to ask "can I bind something to the
> remainder"; I think this is mostly an "attractive distraction", and
> would prefer to not have this dominate the discussion.
> </digression>
>
> The idiom of "match a list by matching (head, tail)", which works great
> in Lisp and Haskell, is that (a) the representation of lists in Lisp and
> Haskell is a cons-cell, and (b) these language have tail-call
> elimination, so that processing a list by recursion in this manner is
> natural, efficient, and doesn't SOE. Java has neither of these, so
> grafting the illusion of this model when the runtime is not suited to it
> is just moving the problem one foot down the road, but ultimately is not
> going to be satisfying. The performance will be poor, and we'll SOE on
> lists longer than a few tens of thousands of elements.
>
> The bottom line here is that idioms from Language X are very much
> connected to _the rest of language X_. Ignoring this rarely works out
> well.
>
> > Another issue is if the array is shorter say 0 length and one has:
> >
> > if (arr instanceof int[] { var a, var b, ... }) { ... }
> >
> > Will this be an ArrayIndexOutOfBoundException or another exception? If
> > it is a reference type `a` and `b` can be null.
>
> No. Pattern matching is inherently conditional; the match above says
> "does `arr` match this array pattern". Matching the array pattern means
> being an array, _and_ having the right number of elements, _and_ having
> those elements match the nested patterns. Matching should never throw
> (though, once we allow users to write patterns that have code in them,
> it will be possible to do things like NPE, but those are bugs.)
>
> >
> >
> > On Wed, 6 Jan 2021 at 15:31, Gavin Bierman <gavin.bierman at oracle.com
> > <mailto:gavin.bierman at oracle.com>> wrote:
> >
> > This is a feature that other languages call an “as pattern”,
> > because you are adding a new pattern variable binding to another
> > pattern (Standard ML used “as”, Haskell uses “@“ but calls it an
> > as pattern). It’s on our list of things to consider; part of the
> > consideration is whether it merits special syntax along with the
> > parsing issues of not having special syntax.
> >
> > Gavin
> >
> > > On 6 Jan 2021, at 05:44, Suminda Sirinath Salpitikorala
> > Dharmasena <sirinath1978m at gmail.com
> > <mailto:sirinath1978m at gmail.com>> wrote:
> > >
> > > Can we have something like:
> > >
> > > if (arr instanceof String[] { var a, var b, ... }
> > stringArray) {
> > > ... }
> > >
> > > `stringArray` is optional but if present this will referrer to
> > the whole
> > > array.
> > >
> > >>
> >
>
>
More information about the amber-dev
mailing list