"Austin Hastings" <[EMAIL PROTECTED]> writes:

> [Eirik wrote:]
> >   Let us see ... somewhat speculative and probably short-of-the-mark
> > generalization coming up:
> >
> >
> > macro infix:[  ($lhs, $op, $rhs)
> >     is parsed(/(<Perl6.expr>) \] (<Perl6.expr>)/) {
> >     return {
> >         $op($lhs, $rhs)
> >     };
> > }
> >
> >   (Precedence?  Err ... the left hand side has already been parsed,
> > so infix:[ must be of fixed precedence to the left hand side, right?
> > Damn, I thought I had it ...)
> 
> This is text replacement, not expression evaluation. You do have it from
> where I sit.

  Text replacement?  This is returning a closure, not text.  But even
if this is a case of text replacement, I get the first parameter,
$lhs, from text that has already been parsed.


>   # Note: Need a way to parse nested []'s
>   macro [ ($whosit) is parsed(/(<?:\s[) (<expr>) \]/) {
>     eval $whosit;
>   }

  I may not be up-to-date on macros and is parsed, but ITYM:

macro prefix:[ ($whosit) is parsed(/(<Perl6.expr>) \]/) {
  return eval $whosit;
}

  This should return text, I believe.  But the parser will not be
expecting a term (or prefix:-operator) here ... it is looking for
an infix:-operator or a postfix:-operator, right?

  (And it will eval() at compile time, so my phase-of-the-moon example
will not be evaluated at run time, even if this works.)


> The macro immediately evaluates the expression, so it has to be a deferrable
> reference.
> Then:
> 
>   macro infix:eqn($n) is equiv (&infix:eq) {
>     "[&String::strncmp.assuming(n => 4)]"
>   }

  (s/4/\$n/, I believe.)

  But the infix:-operators by default get their LHS and RHS parse
trees as parameters, last I heard, so your parameter list is too
short.  Still, you may be on to something ... what about this?

macro infix:eqn ($lhs, $n, $rsh) is equiv(&infix:eq)
  is parsed(/ \( (<Perl6.expr>) \)
                 (<Perl6.expr but speculatively_equiv(&infix:eq)>)/) {
  return "String::strncmp($lhs, ($rhs), ($n))";
}

  if "Dough" eqn(4) "Douglas" {...}
becomes
  if String::strncmp("Dough", ("Douglas"), (4)) {...}

  Okay, that may be evil.  But it DWYW, right?


  No such luck with my phase-of-the-moon example, though.  And come to
think of it, finding the right precedence might be tricky, even if
this (or more complicated re-parsing tricks) should happen to work:

macro infix:[  ($lhs, Sub $op, $rhs)
    is equiv($op)
    is parsed(/(<Perl6.expr>)
                \]
               (<Perl6.expr but speculatively_equiv($op)>)/) {
    return "($op).(($lhs), ($rhs))";
}

# This might be determinable at compile time:
if $test [$moon.is_waxing ? &infix:< : &infix:>=] $target {...}

# This would need explicit "but equiv" or something like that:
if $test [($lookup{$key} || &infix:eq) but equiv(&infix:eq)] $target {...}


  So, probably just a bad idea.


Eirik
-- 
All bridge hands are equally likely, but some are more equally likely
than others.
                -- Alan Truscott

Reply via email to