> From: "Brian Goetz" <brian.go...@oracle.com>
> To: "Remi Forax" <fo...@univ-mlv.fr>
> Cc: "Gavin Bierman" <gavin.bier...@oracle.com>, "Manoj Palat"
> <manoj.pa...@in.ibm.com>, "amber-spec-experts"
> <amber-spec-experts@openjdk.java.net>
> Sent: Lundi 19 Juillet 2021 15:49:22
> Subject: Re: [External] : Re: case null and type pattern

> Sure, but again, I think users would find that restriction even more annoying;
> the vast majority of guards in languages with guarded patterns use the 
> bindings
> to refine the match. I'm not sure users would thank us for moving the
> restriction in this way.
I was thinking about the binding after the ':' or '->', not the fact that the 
same binding is used inside a guard, 
because it's not exactly the same binding. 

Let's compare 
case String s && s != null -> 
and 
case null, String s && s != null -> 

in the second case, there is a 'merge' between null and String s, there are two 
questions, do we allow this kind of merge and does a merge with null a special 
kind of merge. 

> A more interesting flavor of the same question, though, is what happens if we
> allow _ to be used as a binding name. Then, the restriction on fall-through
> could be relaxed if we wanted; it would be safe to do:

> case Foo _, Bar _: blah

> whereas today we don't allow mixing of these patterns.
I agree, it seems we want to allow some merging (with null, with '_', are there 
others ??) but not the general form. 

Rémi 

> On 7/19/2021 9:09 AM, Remi Forax wrote:

>>> From: "Brian Goetz" [ mailto:brian.go...@oracle.com | 
>>> <brian.go...@oracle.com> ]
>>> To: "Gavin Bierman" [ mailto:gavin.bier...@oracle.com |
>>> <gavin.bier...@oracle.com> ] , "Manoj Palat" [ 
>>> mailto:manoj.pa...@in.ibm.com |
>>> <manoj.pa...@in.ibm.com> ]
>>> Cc: "amber-spec-experts" [ mailto:amber-spec-experts@openjdk.java.net |
>>> <amber-spec-experts@openjdk.java.net> ]
>>> Sent: Lundi 19 Juillet 2021 15:00:16
>>> Subject: Re: case null and type pattern

>>> Right. In theory, we could allow guarded patterns here, but they will be 
>>> hard to
>>> use, since users will likely want to use the binding in the guard, and would
>>> have to check for nullity every time.
>> As you said, the error is to be able to use the binding not to be able to
>> express that pattern.

>> Rémi

>>> On 7/19/2021 6:16 AM, Gavin Bierman wrote:

>>>> Hi Manoj,

>>>> This is certainly something we can discuss for Preview 2, but…it is 
>>>> intentional
>>>> for now. The `case null, T t` is really a special case of extending a type
>>>> pattern to be null friendly. Remember that the pattern variable `t` is
>>>> initialised with null if this case label applies.

>>>> The problem with what you are suggesting is that we’re going to end up 
>>>> with code
>>>> like:

>>>> switch(o) {
>>>>     …
>>>>     case null, String s && s != null -> …
>>>> }

>>>> Now the developer has a guard saying that `s` is not null, and is probably 
>>>> going
>>>> to assume this in the body of the switch rule, but has erroneously 
>>>> extended the
>>>> case label with null.

>>>> So, it’s just an attempt to remove potential puzzlers by design. But we 
>>>> can take
>>>> a look at whether we can capture a more generous definition. An alternative
>>>> would be to define a new null-friendly type pattern. Let’s talk about it!

>>>> Thanks,
>>>> Gavin

>>>>> On 14 Jul 2021, at 23:43, Manoj Palat [ mailto:manoj.pa...@in.ibm.com |
>>>>> <manoj.pa...@in.ibm.com> ] wrote:

>>>>> Hi Gavin, All,

>>>>> In [
>>>>> http://cr.openjdk.java.net/~gbierman/jep406/jep406-20210608/specs/patterns-switch-jls.html#jls-14.30.1
>>>>> |
>>>>> http://cr.openjdk.java.net/~gbierman/jep406/jep406-20210608/specs/patterns-switch-jls.html#jls-14.30.1
>>>>> ] , Section 14.11, I see "If a switch label has a null case label element 
>>>>> then
>>>>> if the switch label also has any pattern case element labels, they must 
>>>>> be type
>>>>> patterns (14.30.1)." implying that the following code:

>>>>> private static void foo(Object o) {
>>>>> switch (o) {
>>>>> case null, Integer i && i > 10 -> System.out.println(0); // flag error?
>>>>> default -> System.out.println(o);
>>>>> }
>>>>> should have an error flagged for case label with null since the pattern 
>>>>> case
>>>>> label element is not a type pattern but a guarded pattern.
>>>>> Any reason for excluding guarded patterns here? Or does this requires a
>>>>> modification in spec to include guarded patterns as well?

>>>>> Regards,
>>>>> Manoj

Reply via email to