I am becoming more worried again about the consequences of using a contextual 
keyword such as “yield”, especially for IDEs.

It seems to me that this whole discussion kicked off with a discussion of 
`yield` as being desirable because, by analogy with `return` being the One True 
Way to return a value from a stack frame for an invocation, it might be 
desirable to have One True Way to return a value from a statement-like 
expression that did not create a stack frame.  So if in future we might have a 
number of other expressions from which we want to return a value, we might want 
to pick a keyword not specifically associated with `switch`.

But I now think that this argument is weak, because I believe it is in fact 
unlikely that there will be a large number of other statement types that we 
will want to turn into expressions.

        * Yes, we may want block expressions.
        * We would want `if`-statement expressions _except_ that we already 
have the ternary operator ? :, so I don’t really think there is a pressing need.
        * As a Common Lisp programmer, I can see the value of having a `for` 
loop produce a value.  But I very much doubt that Joe Java-programmer wants 
that.
        * And if we don’t want values from `for` loops, I doubt there will be 
much demand for values from `while` loops or `try` statements.

So I really do think that ? : and  `switch` expressions and blocks really are 
it.  Sometimes there really *are* only two or three things of real interest, 
even if one could theoretically dream up more.

And if I am wrong, there is still a way out for the rare cases: if we have a 
way to do a non-local yield from a block, you can wrap that kind of block 
around any statement you like, just as you can `break` from any kind of 
statement by wrapping a labeled-statement around it (that is, by giving it a 
label).

So I am now leaning toward either `break-with` (or `switch-yield`, but I think 
`break-with` is better).

And if we ever do expression blocks, then we could have a special thing for 
returning from them.  In fact, I have a suggestion:

        block expression                   ({  statements; expression  })
        labeled block expression     (label: {  statements; expression  })
        nonlocal block yield            break label: expression;

In fact, if we had those, we wouldn’t need a special way to yield a value from 
a switch expression; we could just write

        (label: switch { . . . ; case 43: { printf(“foo”); break label: 96; } . 
. . })

which in turn suggests that we could omit the label from the `switch` statement 
and the corresponding `break` statement if we wanted—in other words, under this 
theory a plausible spelling of `break-with` is `break:`.  :-)

—Guy

Reply via email to