> Luke Palmer wrote:
> > [quote from A4]
> > To me, this looks like it has answers to all these questions.
> 
> Up to a point. Look at the discussion of given/when in the same
> Apocalypse. Here's some example code from A4:
> 
> 
>     given $! {
>         when Error::Overflow { ... }
>         when Error::Type { ... }
>         when Error::ENOTTY { ... }
>         when /divide by 0/ { ... }
>         ...
>     }
> 
> Look, closing braces, ending statements, not on a line by
> themselves. There's code like this all through the apocalypse and its
> associated Exegesis, so it looks to me like C<< rx/\} \s* \n/ >> is
> the regex for 'end of statement'. Either that or we're back with a
> pile of special cases, which I thought the Apocalypse was supposed to
> be eliminating.

That's because C<when>s are statements. Statements don't need to be 
terminated. In C (or even Perl 5) you don't need to write:

        if (a < b) { foo(); };

That's because the grammar says that conditionals (and loops) are 
statements all by themselves, because this doesn't make sense:

        1 + if (a < b) { foo(); } / 2;

But in Perl 6, things are moving around.  Perl 6 needs the ability for 
users to program such interfaces with subs, which I<are> expressions.  So, 
according to Damian, if a sub's last argument is a closure, it can (but 
not necessarily will) act like a statement rather than an expression. 
>From what I understand of his message, this has nothing to do with 
whitespace.

I don't know the exact semantics, if they are what I think they are, then 
I disagree.

        sub cond_if ($condition, &code) {...} # returns something

        cond_if ($x < $y) { $y }
        for @a; @b; @c; # ...

This requires infinite lookahead to parse.  Nobody likes infinite 
lookahead grammars.

Personally, I liked the A4 decision the best ('}' on a line by itself), 
and I think otherwise there's too many ambiguities like this one.  
However, if an elegant solution has been (or is going to be) found, I'm 
all ears. 

Luke


Reply via email to