Perhaps something like:
@sorted = sort { infix:<=> map { scalar $_.foo('bar').compute } @^_ } }
@data
I'm not entirely sure it's readability is better than yours, though.
Dave.
"Luke Palmer" <[EMAIL PROTECTED]> wrote in message
news:[EMAIL PROTECTED]
> 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.
>
> I can see a couple less-than-desirable ways around this redundancy:
>
> @sorted = sort { infix:<=>( *($^a, $^b)�.foo('bar').compute ) }
> @unsorted;
>
> Which doesn't work if .compute returns a list... not to mention its
> horrible ugliness. Another is to define a variant of sort (haven't had
> much practice with A6 material recently; here we go!):
>
> multi sub sort (&block($) = { $_ } : [EMAIL PROTECTED]) {
> sort { block($^a) cmp block($^b) } @data;
> }
>
> @sorted = sort { .foo('bar').compute } @unsorted;
>
> Which has the disadvantage of forcing you to use C<cmp> and forcing an
> ascending sort.
>
> Any other ideas? Is a more general solution necessary?
>
> Luke