Here's a question regarding the pattern grammar.  We anticipate:

    Type patterns:            TypeName[?] bindingName
    Constant patterns:        StringLiteral | NumericLiteral | Identifier
    Deconstruction patterns:  TypeName(Pattern*)
    Any patterns:             var bindingName | "_"

Note that we are fairly rigid here about binding variables; constant and underscore-any patterns _cannot_ have them, type and var-any patterns _must_ have them.

One area where we have a question about whether to support an optional binding variable is in deconstruction patterns:

    case Point(var x, var y) p: ...

Sometimes it is desirable to bind the cast target as well as its components (Scala and Haskell support this with the `var@pattern` syntax.)  Can anyone offer pros/cons here for supporting this based in real-world experience?  (Assume someone has already said "I could imagine how that might be useful.")





On 10/20/2018 1:58 AM, Tagir Valeev wrote:
Hello!

It seems that sometimes it could be useful to have intersection types
in patterns. Assuming
interface Foo { void foo(); }
interface Bar { void bar(); }

one might want to match `obj instanceof (Foo & Bar) foobar` to be able
to call both `foo()` and `bar()`. After all we can now declare `var
foobar = (Foo & Bar) obj`.

Another interesting case is when LHO of matching operator is not
assignable from pattern type. Like `if (getFoo() instanceof Bar bar) {
bar.bar(); bar.foo(); }`. We know that getFoo() returns Foo, thus bar
is Foo as well. Probably it's type could be narrowed to the (Foo &
Bar) intersection automatically.

I'm not sure whether there are many usecases for this, but probably it
worth exploring.

With best regards,
Tagir Valeev.

Reply via email to