Re: Something about the cascade calling of sort() in rakudo.

2010-03-23 Thread Moritz Lenz
Hi,

Hongwen Qiu wrote:
 Hi, I'm new to Perl6. And just ran the first example in the perl6 book.
 But, it refused to work. It complains as follows:
 
 Too many positional parameters passed; got 2 but expected between 0 and 1
 
 I find out that the problem is in the line:
 
 my @sorted = @names.sort({ %sets{$_} }).sort({ %games{$_} }).reverse;
 
 And I tried eliminate the second sort, or just the parameters in the
 second sort. In both cases, it works.
 
 So, why is this happen? Can it be a bug?

Yes. Thank you for your report.

Rakudo has gone through a major rewrite, and in that process some of the
features have temporarily disappeared. .sort() with a block accepting
just one parameter is one of these features.

So it works with some older versions of Rakudo (name the January
release), and we'll make sure it works in the Rakudo Star release in
2010-Q2.

 Sorry for my poor English. Hope you all understand what I'm trying to say.

Yes, it is quite good.

However in future please write about possible compiler errors to the
perl6-compil...@perl.org list, where they are more on topic.

Cheers,
Moritz


Re: Something about the cascade calling of sort() in rakudo.

2010-03-23 Thread Solomon Foster
2010/3/23 Moritz Lenz mor...@faui2k3.org:
 Hi,

 Hongwen Qiu wrote:
 Hi, I'm new to Perl6. And just ran the first example in the perl6 book.
 But, it refused to work. It complains as follows:

 Too many positional parameters passed; got 2 but expected between 0 and 1

 I find out that the problem is in the line:

 my @sorted = @names.sort({ %sets{$_} }).sort({ %games{$_} }).reverse;

 And I tried eliminate the second sort, or just the parameters in the
 second sort. In both cases, it works.

 So, why is this happen? Can it be a bug?

 Yes. Thank you for your report.

 Rakudo has gone through a major rewrite, and in that process some of the
 features have temporarily disappeared. .sort() with a block accepting
 just one parameter is one of these features.

Actually, as we just determined on #perl6, it works normally, and only
fails under certain conditions -- basically when you get a low-level
collection of things rather than something based on the Perl 6 Seq or
Iterator classes.  So there is a fairly simple workaround:

colomon: rakudo: say (-5...10).sort({.abs}).sort({.abs}).perl
p6eval: rakudo db0f85: OUTPUT«Too many positional parameters passed;
got 2 but expected between 0 and 1␤current instr.: '_block68' pc -1
((unknown file):-1)␤»
colomon: rakudo: say (-5...10).sort({.abs}).Seq.sort({.abs}).perl
p6eval: rakudo db0f85: OUTPUT«(0, -1, 1, -2, 2, -3, 3, -4, 4, -5, 5,
6, 7, 8, 9, 10)␤»

That is, adding a .Seq between the two sorts clears up the problem.
That is admittedly a hack, but it is a simple one.

Thanks for reporting the problem!

-- 
Solomon Foster: colo...@gmail.com
HarmonyWare, Inc: http://www.harmonyware.com