Swiss Cheese Issue - Revisit?
Brian Goetz
brian.goetz at oracle.com
Wed May 6 14:41:33 UTC 2020
I think I get what you are saying, but we didn't go out of our way to
_support_ it, we chose _not_ to go out of our way to _disallow_ it. So
it's not like we added a feature, as much as didn't disable an interaction.
Could you clarify what you mean?
On 5/6/2020 10:21 AM, Remi Forax wrote:
> I would like to add that the Swiss Cheese problem is specific to
> instanceof, it's not a pattern matching issue per se.
> So there is another far easier solution to the Swiss Cheese problem,
> don't support it because instanceof will be less prominent in the
> future and instanceof in equals() can be re-written to avoid the Swiss
> Cheese.
>
> I'm afraid we have gone a step too far by trying to support it.
>
> Rémi
>
> ------------------------------------------------------------------------
>
> *De: *"Brian Goetz" <brian.goetz at oracle.com>
> *À: *"Manoj Palat" <manoj.palat at in.ibm.com>, "amber-spec-experts"
> <amber-spec-experts at openjdk.java.net>
> *Envoyé: *Mercredi 6 Mai 2020 15:02:13
> *Objet: *Re: Swiss Cheese Issue - Revisit?
>
> We experimented with a "cheese shield" approach:
>
> - compute the scope(s) of a binding variable as a set of position
> ranges: s0..e0, s1..e1, ...
> - compute the maximal scope for each variable: min(s0, s1, ...)
> .. max(e0, e1, ...)
> - treat the gaps as implicitly shadowing fields of the same name
> with an erroneous local
>
> If implementing the flow scoping is hard, I would think
> implementing the shielded flow scoping is harder. The reason is
> that, while we might think that there is a "natural rectangular
> scope" for a binding, there really isn't. So the shield gives you
> _two_ kinds of irregularly-scoped things.
>
> But, design decisions should put the user first. So the question
> is, whether the users are served better by:
>
> - having fragmented scopes, through which light can shine, or
> - patching the holes so you cannot access the fields without
> qualification, even though the corresponding binding variable is
> "out of scope"
>
> And, it was really not clear which was the lesser of evils here.
> There was some concern raised that this seemed scarier than it
> really is because it is "new and different", but not intrinsically
> bad.
>
>
>
> On 5/6/2020 5:28 AM, Manoj Palat wrote:
>
> Hi Brian, Gavin, all,
>
> Referring to Tagir’s example in [1]
>
> if (obj instanceof String str) {
>
> System.out.println(str.toLowerCase()); // str refers to
>
> pattern binding
>
> } else {
>
> System.out.println(str.toLowerCase()); // str refers to the field
>
> }
>
> which is mentioned as Swiss cheese issue in the replies to [1]
>
> From our development efforts in ecj (Eclipse Compiler for
> Java) for this feature:
>
> "swiss cheese" is hard for implementation by compiler(atleast
> ecj) and understanding by users alike. For conflicts *within a
> local scope* tools and users can use a structural strategy to
> find the nearest candidate declaration to which any name
> reference should resolve, deferring to flow analysis only the
> question, whether that resolution is legal. This is not true
> for fields, where no structural 'proximity' applies.
>
> For that reason we propose a compromise, whereby "swiss
> cheese" is allowed for pattern variables, but disallowed for
> fields shining through in the holes of the cheese. This can be
> achieved by disallowing a pattern variable to shadow a field.
> This is a significantly smaller cost than having to invent
> cascades of names for a cascade of pattern variables (the
> original motivation for swiss cheese – as in Gavin’s message[2]).
>
> With this proposals users have a chance to find a declaration
> by looking only up and out starting from the point of
> reference. For the implementation in ecj this makes a huge
> difference, because admitting swiss cheese involving fields
> would require us to abandon the strict separation of
> compilation phases 'resolve' and 'flow analysis'. Since this
> separation is one of the fundamental design principles in the
> ecj compiler, a change would require a major re-architecting
> of the compiler, draining resources from other, high priority
> tasks.
>
> In summary, we don't object to using flow criteria to
> determine whether or not a variable is in scope, we only
> object to flow criteria to *select* between different
> same-named variables, that could be in scope at the same
> location. As far as we can see, this situation is specific to
> fields and hence a change specific to fields should avoid the
> major complexity.
>
> In a spec, one could optionally generalize in a way that a
> pattern variable may never shadow any other variable (local or
> field) that is in scope.
>
> [1http://mail.openjdk.java.net/pipermail/amber-spec-experts/2019-November/001835.html
> [2]
> _https://mail.openjdk.java.net/pipermail/amber-spec-experts/2019-December/001837.html_
> Regards,
> Manoj
> Eclipse Java Dev
>
>
>
More information about the amber-spec-observers
mailing list