--- Luke Palmer <[EMAIL PROTECTED]> wrote:
> > Paul wrote:
> > > --- Austin Hastings <[EMAIL PROTECTED]> wrote:
> > > 
> > >>Dave Whipp wrote:
> > >>
> > >>>Joe Gottman wrote:
> > > 
> > > 
> > > Getting deep -- sorry. :)
> > > 
> > > 
> > >>>>Alternatively, there might be a new parameter type that
> indicates
> > >>>>that the parameter is not evaluated immediately:
> > >>>>
> > >>>>sub infix:!! ($lsh, $rhs is deferred) {...}
> > > 
> > > 
> > > If the standard is pass-by-ref it wouldn't trip any side effects
> unless
> > > you did so in your code, right? So is this necessary?
> > > 
> > 
> > There are two reasonable semantics for deferred parameters:
> > 
> > 1) lazy evaluation with caching, where the evaluation of the
> > actual expression in the call is deferred until the sub
> > actauly makes use of it and the result is then cached and
> > reused as necessary.  Any side effects happen only once.
> > 
> > 2) ALGOL style pass by name, where the actual expression from the
> > call is turned into a clouser called a thunk which is called
> > when ever the sub access the parameter.  Note that the thunk
> > may need to be an lvalue clouser to handle is rw paramenters.
> > Side effects happen each time the thunk is called.  Also changes
> > to the thunks environment can effect its value when called.
> 
> I think (2) would be best.  Because of:
> 
>     while $a < $b { ... }
> 
> That wouldn't be possible with just evaluating it once.  I like the
> interface better, too (for the writer of C<while>), but that's just
> me.

Since parms are defaulting to reference, could I just say:

sub foo($arg) { while $arg >= 0  { print $arg; } }

foo( \{ $i-- } ); 
or: foo \{ $i-- };
or: foo {$i--};

and get that behavior? Is that a good idea?

Regardless, consider:

$a || $b && $c

This translates to:

infix:||($a, infix:&&($b, $c))

so if I want to write infix:!! I could do:

infix:!!($left, &right is expression) is equiv(infix:||)
{
  return unless predicate($left);
  return $left << &right;
}

But this have the unfortunate side-effect of requiring that all use of
the !! operator take place after the declaration -- not the end of the
world except when you want to overload a "known" symbol and make a
"short-circuit bitwise or" operator that does something other than
bitwise-or, perhaps.

In which case, go code C++, or write a macro, or get your declaration
to the top of the pile.

But this WILL impact the code generator/optimizer. Perhaps P6 needs the
notion of sequence points...


> 
> Luke

=Austin

Reply via email to