> De: "Brian Goetz" <brian.go...@oracle.com> > À: "amber-spec-experts" <amber-spec-experts@openjdk.java.net> > Envoyé: Mercredi 6 Janvier 2021 21:52:19 > Objet: New pattern matching doc
> I have pushed > [ > https://github.com/openjdk/amber-docs/blob/master/site/design-notes/pattern-match-object-model.md > | > https://github.com/openjdk/amber-docs/blob/master/site/design-notes/pattern-match-object-model.md > ] > to the amber-docs repo, which outlines the direction for how patterns fit into > the object model. Hi Brian, i'm glag that "deconstructor" can now be virtual. Given that a "deconstructor" is now very like a method but with the caveat that you can not call them directly, i think it's time to change the name from "deconstructor" to xxx method, let say "case method" (i'm sure there is a better name), because they are closer to real methods than initially anticipated. Otherwise, "adhoc polymorphism" is a kind of overloaded ( :) ) term, it is used for overloading, and several other exotic kinds of polymorphism in the literature, i think that pattern polymorphism or case polymorphism is a better term. I think there is a missing discussion about what a case method can return, it can return something saying no match, it can return something saying there is a match and here are the values. One question is how the values are associated to the bindings, in the pattern, you have a notion of order, i.e. Point(var x, var y), x is the first binding and y the second, but in your proposed syntax, there is no notion of order, you associate a name to a value. If you remember, that's why i ask if when a pattern calls the case method, it's a call by name or a call by value. Given that you want overloading, it has to be a call by value, but in that case, the proposed syntax looks very weird. I would prefer a syntax that convey that the semantics is not a call by name By example, something along that line class Optional<T> { T value; case of() { if (value == null) { return no-match; } else { return match(value); } } case empty() { if (value == null) { return match; } else { return no-match; } } } Here the "return" is redundant, but my point is not to discuss the syntax but the associated semantics, so the syntax is just here to illustrate the point. regards, Rémi