Luke -- Hmmm... I haven't been practicing my Perl 6, and its been a while since the last Apocalyptic refresher, but here goes (I'll don a paper bag preemptively)...
Thinking of that as the equivalent to: sort { my ($ta, $tb) = map { $_.foo('bar').compute } ($^a, $^b); $ta <=> $tb } @unsorted; so if you had a unary <=> that took a two element array (old style syntax here, sorry): sub cmp_num { my ($a, $b) = @_; $a <=> $b; } you could write that as: sort { cmp_num map { $_.foo('bar').compute } ($^a, $^b); } @unsorted; I'd be a bit afraid of allowing <=> itself to be prefix, although I admit it would be handy not to need the separate sub definition: sort { <=> map { $_.foo('bar').compute } ($^a, $^b); } @unsorted; The Schwartzian is the usual way, of course: map { $_->[1] } sort { $^a[0] <=> $^b[0] } map { [ $_.foo('bar').compute, $_ ] } @unsorted; But we really aren't being concise here. (Aside) I wonder if there will be a new Perl 6 idiom to replace this using properties, something like this: map { $_.really } sort : numerically map { $_.foo('bar').compute but really($_) } @unsorted; or: @unsorted ==> map { $_.foo('bar').compute but really($_) } ==> sort : numerically ==> map { $_.really }; But we *still* aren't concise. Maybe we should have a two-block sort? The second block gives the transform to apply to the elements before applying the comparison block: sort { $^a <=> $^b } { $_.foo('bar').compute } @unsorted; Or maybe even something like this: sort :numerically :as { $^a.foo('bar').compute } @unsorted; Regards, -- Gregor On Wed, 2004-02-11 at 19:11, 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. > > 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 -- Gregor Purdy [EMAIL PROTECTED] Focus Research, Inc. http://www.focusresearch.com/