> On 19 Apr 2017, at 14:55, Remi Forax <[email protected]> wrote:
> 
> Thanks Brian,
> nice summary, obviously, i'm more interested by the other side of this 
> document, the dark side, i.e. how to implement the pattern matching.

:-) The current pattern matching prototype is decoupled from the more advanced 
implementation effort. 


> so i've mostly syntactic comments:
> - I was wondering if matches can be spelled instanceof ?
>  i.e if the Java grammar can be extended to support (foo instanceof String s) 
> ?

Possibly, but as a pattern can be a literal value you’d end up allowing (foo 
instanceof 42). Or, I suppose we could extend instanceof to permit type 
patterns only. Seems a little ad-hoc though.

> - the var pattern: i'm sure you have considered removing the 'var'
>  int eval(Node n) {
>      return exprswitch(n) {
>          case IntNode(i) -> i;
>          case NegNode(v) -> -eval(v);
>          ...
>      };
>  }
>  but reject it because
>    - from the compiler perspective, you have to wait the typechecking pass 
> (or a pass just before) to know if a symbol 'v' is a parameter or variable 
> access.
>    - if someone write:
>        return exprswitch(n) {
>          case NegNode(n) -> -eval(n);
>        };
>      n in NegNode(n) is a value and not a variable, which is a nice puzzler.
>    - or it means not supporting constant in patterns.
> 
>  Am i right ?

Kind of. We are still working through exactly what we think nested patterns 
mean. But what the document suggests is that the pattern has a set of binding 
variables (maybe call these the pattern variables) that are bound by the 
process of pattern matching (possibly by an extractor). So it’s reminiscent of 
a (very) local declaration; so ‘var’ seems like the right syntax.  Also, as you 
spotted, it makes for less grammar ambiguity. 

I don’t think we plan to support equality patterns as you suggest in the 
NegNode(n) example (if I’m reading it right). If you want that, then you should 
use a guard:

case NegNode(var x) where x == n -> ...


Gavin


> 
> - exhaustiveness,
>  if the class is sealed/closed, i think all data class should be declared 
> into the interface
> 
>    sealed interface Node {
>      data class IntNode(int value) { }
>      data class NegNode(Node node) { }
>      ...
>    }
>  It makes more clear the fact that you can not open the interface Node to add 
> a new subtype and you do not need to declare that each subtype implements the 
> sealed class.
> 
>  It also means that the real name of IntNode is now Node.IntNode (so you can 
> remove the Node suffix !), but you mostly don't care because when you use the 
> exprswitch, you're switching over a Node so the compiler can infer the right 
> name the same way the compiler infer the right name of an enum constant.
> 
>  And more or less like Scala, the compiler can add a bunch of static factory 
> methods so instead of new Mode.IntNode(0), one can write Node.IntNode(0), 
> IntNode being the name of a factory method that creates an IntNode.
> 
>  The astute reader in me see that as a sum type for the compiler and an 
> interface for the VM, i.e. even if the VM do not allow other subtypes than 
> the one listed at runtime, the fact that you do not have to have a default 
> branch should be a JIToptimization, in the bytecode or in a corresponding 
> method handle tree, the default branch should still exist. 
> 
> regards,
> Rémi
> 
> ----- Mail original -----
>> De: "Brian Goetz" <[email protected]>
>> À: [email protected]
>> Envoyé: Mardi 18 Avril 2017 23:34:45
>> Objet: Published: pattern matching
> 
>> I've made public the following document:
>> 
>>    http://cr.openjdk.java.net/~briangoetz/amber/pattern-match.html
>> 
>> which offers an overview of possible directions for pattern matching in
>> Java.  This is an exploratory document and does not constitute a plan
>> for any specific feature in any specific version of the Java Language.
>> Similarly, though it may reference other features under consideration,
>> this is purely for illustrative purposes.  There is no timetable on
>> which these features might appear, if ever.
>> 
>> Over the next few weeks, I'm going to begin, slowly, discussing various
>> aspects of pattern matching on the EG list.

Reply via email to