The two current examples of an evil expression block are do {} and eval {},
which require a semicolon terminator. However, with eval {} leaving, that
leaves just do {}, which does (or should) fall more in line of thinking of
grep {}, map {}, and sort {}: the other expression blocks. For do {}, the
block just happens to be the only (and therefore, trailing) argument. (In
other words, from an language perspective, do {} really should be presented
more as 'do' and less as '{}'. Much of the block confusion came from the
specialization of do-while and do-until. But both of these are illegal in
Perl 6, so there's no longer a reason to propagate that misconception.)
With try {} appearing to be a proper block, that would leave do {} the only
beneficiary of the Lone Bracket hack. (For now. I continue this below.)
So, in essence, you are trading "you need to remember that do {} is just an
expression, treat is as such" to "do {} is an expression. You can write it
as a block (as long as the close bracket is on a line by itself), and we'll
tack on the semicolon for you, but don't write it as a block when you want
an expression, unless you put the rest of the expression on the same line as
the bracket." Although each individual rule is simple, the overall
semantics have become quite complex for such a small subsection of the
language. And attempting to leverage that against a lone bracket, I feel is
a mistake. From a linguistical perspective, that seems to be more
presentationally based, rather than contextual.
Most everything in Perl is done in context, so why not leverage that
instead? After all, the semi-colon will be needed to terminate an anonymous
hash assignment, yes?
my $ahash = {
foo => bar
};
It seems to me that when people use a block as a code block, they simply
don't make it do expressionish things. Like capture the return
value. Blocks are almost always - there are always Damians in the world -
used in a void context.
my $a = do {
....
}
No, it's not a block, it's an expression. It shouldn't even be presented as
a potential block. You've a do {} in the midst of a long string of things,
it shouldn't terminate simply because I'm formatting for clarity.
do {
...
}
could be a block. Particularly now that base blocks are forbidden, this
will be a block. The question is whether the expression continues
afterwords:
+ 1 for @x;
The parser should be able to determine whether the expression continues
on the next line. You either get an operator or a statement modifier, or
the block is terminated. But for the user who has to remember all the rules,
there's nothing to do. He just writes it. Contextual. Not presentational.
The Apo surmises that some other blocks may become expression blocks,
such as BEGIN {}. I assume CHECK {} and INIT {}, as well? END {} doesn't
make sense. How about any of the new blocks?
Now, you've added even more special cases to the semi-colon rule.:
BEGIN { foo() };
END { foo() }
Some will take them - sometimes - and others won't, at all. Sure, you could
always put a semicolon there, and create a null statement, but you don't do
that now, so why should you start?
Once again, I think the void contextual clues should be differentiating
between block and expression usage. Perl already exprects you to understand
differing behavior in void, scalar, and list context, and Perl 6 is expected
to add more. Why not continue in that direction here, instead of veering
off in some strange direction.
--
Bryan C. Warnock
[EMAIL PROTECTED]