By example, case Optional.of() is called the static pattern in
        the document, but the corresponding member is not static at
        al, it has to have access to the values of the instance.


This is not correct.  The pattern `Optional.of()` is truly static.

The pattern is static, but perhaps not as "static" in a static method call, but as "static" in a method reference way. For Optional.of(var x), the implementation needs to take a look to the content of the Optional, thus the implementation is not static as in static method.

For static patterns, the target is passed as an argument.  Just like the following method:

    class Foo {
        static<T> T unboxIfPresentOrNullIfAbsent(Optional<T> target) {
            return target.isPresent() ? target.get() : null;
        }
    }

This is a static method that "matches" present optionals, and returns their contents if present, or a sentinel if not.  The static pattern Optional::of does the same, just not as a method.

For Integer.parseInt(int value), this is not a instance method of String but a static method inside Integer that either binds an int or does not match.

There's no conceptual difference between this and Optional::of. Each are passed the target; in the former case, the target is an Optional, in the latter, its a String.




    For `case Foo(int x)`, this is a deconstruction pattern, and Foo
    is the name of a class, not of a pattern.  Just like with
    constructors, we look in class Foo (not superclasses) for a
    matching deconstructor.  The target becomes the receiver of the
pattern invocation.

The application test is an instanceof + a call to the deconstructor which as a special linking semantics for transferring the bindings

I am not sure I like the word "call" here, as it suggests that you are trying to cast these things as methods. Under the hood, of course there are going to be methods, because that's what the JVM offers us.  But we're talking about the language model here, so I'd like to avoid confusing words.   But yes, it is as if we are "calling" the deconstructor which puts the bindings somewhere the "caller" can get them.



    For `case Foo.of(var x)`, this is a static pattern.  Foo is the
    name of a class, and `of` is the name of a declared static pattern
in Foo.  The target becomes an argument of the pattern invocation.

The application test is an instanceof + a call to the method an instance method of() with, i hope, the same special semantics for transferring the bindings.

Same transfer of the bindings, but it is not an instance method; static patterns translate to static artifacts.  The switch target (the Foo) is passed as an ordinary parameter.  Then, there is an additional wrinkle on the bindings transfer, because the pattern might say "nope, not really a Foo of anything", in which case we "transfer" a sentinal that says "these bindings are no good, don't use them."

Unlike the deconstructor, this instance method can be overridden (you want to be able to declare such method on an interface).

No, but instance patterns can.


It's more that i want that all patterns that have bindings to share the same meta-protocol (the way to bind bindings).

That is how this works.  Here's the full (abstract) protocol.

 - Every pattern has a target, which is "passed" from the client to the pattern.  - Every pattern can have zero or more output bindings, which are "passed" back from the pattern to the client.  - Patterns can succeed or fail.  In case of failure, they return no bindings.
 - Some patterns are constrained to never fail (total patterns.)
 - Patterns may take additional (input) arguments.  (Canonical example: a "regex" pattern that takes the regex pattern as well as the target.)

Different patterns use different subsets of this protocol.  Total patterns don't make use of the "might fail" channel; none of the patterns so far make use of the "extra args" channel.

This maps to instance/static in a straightforward way: for instance patterns, the target is the receiver, for static patterns, it is passed as the first input argument.

But a constructor neither need a special keyword nor have a semantics different from a classical methods

But this is just not true!  Constructors are different in both syntax and semantics from classical methods.

If I had to read between these pages of indirect objections, I'm tempted to guess that this is all really just: "I'm disappointed that we didn't make constructors just be static methods in the first place, and I want to fix that mistake now?"

Reply via email to