Control Invocation: proposal for simplification

Gernot Neppert mcnepp02 at
Tue Jan 5 00:49:11 PST 2010


I have a proposal to simplify the Control Invocation syntax. It
consists of two parts:

1. Limit the difficulties with non-local transfer to "return",
eliminating "break" and "continue".

2. Waive transparency of "return" in lambdas.

In order to limit non-local transfer issues to "return", I suggest
scrapping the "for-loop abstraction syntax" altogether.
This will make all issues with top-level "breaks" and "continues"
within lambdas disappear, since the compiler will flag them as the
usual error.
To me, the examples provided so far for new loop-constructs are unconvincing.
I think the enhanced for-syntax of Java 5 provides enough convenience
for almost all usecases.

This leaves us with the normal Control Invocation syntax (A method
having a lambda type returning void as its last argument may be
invoked as if it one less argument, followed by a block that
constitutes the lambda).

My proposal: if the compiler spots such a construct, it should issue a
diagnostic if the lamba-block contains a "return".
The message should be something like "return will leave the innermost
block only", suppressable via @SuppressWarning("local-return")

Here's an example using the declaration of "with" from section 0.6b
that will trigger the diagnostic:

with(FileReader in : makeReader())  {
    // code using in

This invocation, however, will not trigger the diagnostic:

with(makeReader() , #void(FileReader in) {
    // code using in

More information about the closures-dev mailing list