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