--- "Joseph F. Ryan" <[EMAIL PROTECTED]> wrote:
> If the final design stays the way it is now, there really won't be
> a "lexer".  Instead, a perl6 grammar parses the data, and builds up
> a huge match-object as it, well, matches.  This match object is then
> munged into the optree.
> 

With this in mind, I'll say it again:

Let's support separable verbs. 

Here's how:

# Note my arbitrary selection of _ as separation indicator. Feel free
to replace this with something more appropriate:

sub if    ($test, &block) 
  _ elsif ($test, &block) is optional is floating is multi
  _ elsunless ($test, &block) is optional is floating is multi
  _ else (&block) is optional is fixed
{
  while (!$args[0].test) shift;
  &args[0].block();
}

Where:

1: I'm hacking real hard on the implementation. Better Ideas Welcome.
2: space-underscore-space means "separable bit". Negotiable. BIW.
3: is optional/[dflt: required] means doesn't have to appear.
4: is floating/[dflt: fixed] means can appear in any order.
5: is multi/[dflt: single] means can appear more than once.

The last three (3, 4, 5) are really just match-hints to the rexer for
"here's how to look for me":

/if <arg-bits> 
  ((elsif <arg-bits> | elsunless <arg-bits>)*)
  (else <arg-bits>)?/

Instead of, say, requiring all the elsif in front of all the elsunless,
or whatever.

I think this is one of those p6-ish generalizations:

try/catch/finally
do/while
if/elsif/elsunless/else
repeat/until
(arguably: switch/case/default)

are all just separable verbs:

sub try (&block)
  _ catch ($e, &block) is optional is multi is fixed
  _ finally (&block) is optional is fixed;

sub do (&block)
  _ while ($cond); # is single is fixed is required

sub repeat (&block)
  _ until ($cond); # is single is fixed is required

sub switch ($cond)
  _ case ($val, &block) is multi is required
  _ default (&block) is optional;

(Note: This leaves switch statements looking like crap, so I'd really
rather sugar them up. But the point is, you *could* to it that way.)

switch ($x)
case (10) { print 10; }
case (11) { print 11; }
default   { print "Something else"; }

=Austin




Reply via email to