tchrist@convex.com (Tom Christiansen) (11/23/90)
Instead of having to doing this:
sub numerically { $a <=> $b; }
@out = sort numerically @in;
wouldn't this be nice:
@out = sort { $a <=> $b; } @in;
You can *almost* do it right now.
$func = 'func0001';
sub makefun { eval "sub $func { $_[0]; }"; $func++; }
$f1 = &makefun('print "hello $a\n"');
$f2 = &makefun('$a++');
for (1..3) {
do $f1(); do $f2();
}
That works just fine. So then I did this:
@a = (3, 5, 12, 3, 9, 23, 93, 1, 445, 33, 12);
$sortsub = &makefun('$a <=> $b');
@a = sort $sortsub @a;
print join(", ", @a), "\n";
And again it worked just fine. However, I could NOT do this:
@a = sort &makefun('$a <=> $b') @a;
Which is too bad. Of course, I would still like things like
@a = sort { $a <=> $b; } @a;
@a = sort { $x{$a} cmp $x{$b}; } keys %x;
to work. You run the risk -- if you want to call it that -- that people
would start writing stuff like this:
@a = sort {
# lots of code
# might intervene here, taking
# a long time to find the list
} @b;
But I still like the idea. I don't see how it could break any scripts.
--tomlwall@jpl-devvax.JPL.NASA.GOV (Larry Wall) (11/25/90)
In article <109155@convex.convex.com> tchrist@convex.com (Tom Christiansen) writes:
: Instead of having to doing this:
:
: sub numerically { $a <=> $b; }
: @out = sort numerically @in;
:
: wouldn't this be nice:
:
: @out = sort { $a <=> $b; } @in;
It would be possible, but apart from the problem you mentioned of making it
hard to find the list, I also think people should occasionally be encouraged
to name their abstractions.
Of course, the fact that it would be hard to implement has nothing to
do with it... :-)
Larrytchrist@convex.COM (Tom Christiansen) (11/28/90)
In article <10521@jpl-devvax.JPL.NASA.GOV> lwall@jpl-devvax.JPL.NASA.GOV (Larry Wall) writes: >In article <109155@convex.convex.com> I wrote: >: wouldn't this be nice: >: >: @out = sort { $a <=> $b; } @in; >It would be possible, but apart from the problem you mentioned of making it >hard to find the list, I also think people should occasionally be encouraged >to name their abstractions. By all means. It's just that the quoted line above seems to be more readable than naming a subroutine for the sort; it would seem easier on both the writer and the reader of the code. I know in teaching perl, students have more than once asked me whether this was possible as soon as I show them how sort takes an optional subroutine. My response generally begins with "Alas, no; ...". >Of course, the fact that it would be hard to implement has nothing to >do with it... :-) I see we come at last to the meat of the matter. :-) In the meantime (and perhaps forever), you can always write a sort() function like this if you really want to: @out = &sort('$a <=> $b', @in); and a byreference version like this: @out = &sortr('$a <=> $b', *in); so that you don't try this: @out = &sortr('$a <=> $b', 3, 4, 2, 1, 4, 98); Naw, that's too complex. I'll go back to naming subroutines for a while. --tom