--- Austin Hastings <[EMAIL PROTECTED]> wrote:
> --- Brent Dax <[EMAIL PROTECTED]> wrote:

> > Except that none of the other ones exist in Perl 6.  :^)
> 

Thinking about this some more, and considering the desirability of lazy
evaluation, I think incremental execution might be the right way.

(Also, at the bottom is a weird version of switch/case that's not
separable. But I don't know if it could work.)


Here's more tries, with
 _                 --- still assumed as separable-sub continuation mark
is separable       --- declaration of separable-sub
is incremental     --- declares that sep-sub bits are called piecemeal
is optional        --- this part of sep-sub doesn't have to appear
is repeatable      --- this part of sep-sub can appear more than once
is floating        --- this part can mingle with other floaters

also, with defaults being not optional, not repeatable, not floating.

also, borrowing the convert_to_sub($) function that DC wrote a while
ago.

# (Modulo stuff to pass-inward the outer topic)
# (Modulo also stuff to pass-outward any leave ops.)

sub do_ife($block)
{
  my &branch := convert_to_sub($block);
  branch();
}

Keyword-like version of 'if_elsif_elsunless_else':

sub if ($c, $block)        is separable is incremental

    is given($c) 
    { when true  { do_ife($block); leave; } }

 _  elsif ($c_, $block)    is optional is repeatable is floating
 
    is given($c) 
    { when true  { do_ife($block); leave; } }

 _  elsunless ($c, $block) is optional is repeatable is floating

    is given($c)
    { when false { do_ife($block); leave; } }

 _  else ($block)          is optional

    {              do_ife($block); }

Enabling: 

if ($a == 'a')       { print 1; }
elsif ($a == 'b')    { print 2; }
elsunless ($a < 'z') { print "out of range"; }
elsif ($a == 'c')    { print 4; }
elsif ($a == 'd')    { print 8; }
else                 { print 0; }


Operator-like version of 'if_otherwise':

sub infix:if($block, $c)  is separable is repeatable is incremental

    is given($c)
    { when true { do_ife($block); leave; } }

 _  otherwise($block)     is optional # is fixed

    { do_ife($block); }

Which gives us:

moo() if cond 
goo() if con2
gai() if con3
pan() otherwise; # "elsewise", for those west of the Pecos...


=================

Here's the Java-like try/catch(e)/catch/finally:

sub try($b)           is separable is incremental
{ 
    my $bogus = sub { return 1; }  # Need a ref the user can't throw.
    my $exc = $bogus;
    my &block := convert_to_sub($b);
    block();
    CATCH { if ($exc == $bogus) { $exc = $!; } else die; }

    # I'd like to leave(), but there might be a finally { } block,
    # below.
}
 _  catch($e, $block) is optional is repeatable 

    { if ($exc ~~ $e)     { $exc = $bogus; do_ife($block); } }

 _  catch($block)     is optional
 
    { if ($exc != $bogus) { $exc = $bogus; do_ife($block); } }

 _  finally($block)   is optional

    { 
      $exc = undef;   # Not $bogus. Throw in here goes through.
      do_ife($block);
    }

================

Here's perl5-like do-with-optional-while

sub do($b)           is separable is incremental
{
    my &block = convert_to_sub($b);
    block();
}
 _  while($c)        is optional
{   
    while ($c)  { block(); }  # Note: this is  use of "other" while.
}
  
=================

Pascally repeat/until using do/while. This one doesn't get called until
the end.

sub repeat($b)      is separable   # NOT incremental
 _  until($c)
    { do $b while (!($c)); }

=================

Here's switch/case, NOT using separable-sub syntax. Instead, I think
a "global method" gets it.

# Help! I'm unsure if the colon-syntax works right, here.

sub switch($c, &cases)
{
    my $fallthru = 0;

    given $c
    {
      cases();
    }
}

#global method. Is this possible? Or should it be Scalar::?
# The idea is to allow case x: {y} as object-indirect syntax
# for x.case({y}) -- I need to define a "global" .case method.

method case($c, &block) is given($_)
{
    if ($fallthru)
    {
        block();
    }
    else
    {     
        when $c 
        {
          block();
          # A "leave switch" in block() skips this part.
          $fallthru = 1;
        }
    }
}

Allowing:

switch ($x)
{
case 1:
  {
    print "Fall";
  }
case 2:
  {
    print "Through";
    leave switch;
  }
case 10:
  {
  print "Hello,world";
  leave switch;
  }
case 20:
  {
  print "Too much.";
  leave switch;
  }
}

Reply via email to