Jonathan Lang wrote:
> Luke Palmer wrote:
> > I've been thinking about this problem which comes up in my code a lot:
> >
> > @sorted = sort { $^a.foo('bar').compute <=> $^b.foo('bar').compute}
> > @unsorted;
> >
> > Often the expressions on each side are even longer than that. But one
> > thing remains: both sides are exactly the same, substitute a $^b for
> > a $^a.
>
> The problem, then, isn't specific to sort; it happens any time that you
> find yourself needing to do the same things to multiple arguments. As
> such, the solution ought to be more general than just sort.
>
> You're looking for something to the effect of:
>
> @sorted = sort { parameters($^a <=> $^b).foo('bar').compute }
>
> That is, you need a way to factor C<.foo('bar').compute> out from each
> of the arguments that it applies to. For list arguments, this is
> straightforward: pipe the list arguments through a map before you pipe
> them into the routine. A similar approach could be used with named
> arguments. The problem comes when you deal with positional arguments.
How about including something similar to <==, but which binds the elements
of the list to the various positional parameters? For instance:
@sorted = sort {infix:<=> args map {$_.foo('bar').compute}, $^a, $^b }
@unsorted;
Where
@x = $a, $b, $c;
routine args @x;
is equivelent to
routine $a, $b, $c;
=====
Jonathan "Dataweaver" Lang
__________________________________
Do you Yahoo!?
Yahoo! Finance: Get your refund fast by filing online.
http://taxes.yahoo.com/filing.html