From: "Patrick R. Michaud" <[EMAIL PROTECTED]> Date: Sat, 4 Oct 2008 09:41:22 -0500
On Fri, Oct 03, 2008 at 09:47:38PM -0700, Larry Wall wrote: > On Fri, Oct 03, 2008 at 11:57:30PM -0400, Michael G Schwern wrote: > : What's the status of numeric upgrades in Perl 6? Is see the > : docs say "Perl 6 intrinsically supports big integers and rationals > : through its system of type declarations. Int automatically > : supports promotion to arbitrary precision" but it looks like it's > : doing the same thing as Perl 5. > > The status of numeric upgrades in Perl 6 is fine. It's rakudo that > doesn't do so well. :) Correct. I suspect that eventually the Rakudo developers will have to develop a custom set of PMCs for Perl 6 behaviors rather than relying on the Parrot ones. The Parrot behavior in this case may be closer than you think. After applying the patch below, I get the expected output from Rakudo: [EMAIL PROTECTED]> ./perl6 -e 'say 2**40' 1099511627776 [EMAIL PROTECTED]> ./perl6 -e 'say 2**50' 1125899906842624 [EMAIL PROTECTED]> ./perl6 -e 'say 2**1100' 13582985290493858492773514283592667786034938469317445497485196697278130927542418487205392083207560592298578262953847383475038725543234929971155548342800628721885763499406390331782864144164680730766837160526223176512798435772129956553355286032203080380775759732320198985094884004069116123084147875437183658467465148948790552744165376 [EMAIL PROTECTED]> It does produces >300 spectest_regression failures, though, so I don't claim the patch is right. Parrot doesn't currently downgrade BigInt PMCs to Integer when it should, though. -- Bob Rogers http://rgrjr.dyndns.org/
Make <infix:**> and <infix:*> DTRT for Int => BigInt promotion. May break other numeric behaviors. Index: languages/perl6/src/builtins/op.pir =================================================================== --- languages/perl6/src/builtins/op.pir (revision 31592) +++ languages/perl6/src/builtins/op.pir (working copy) @@ -59,21 +59,12 @@ ## exponentiation .sub 'infix:**' :multi(_,_) - .param num base - .param num exp - $N0 = pow base, exp - .return ($N0) + .param pmc base + .param pmc exp + $P0 = n_pow base, exp + .return ($P0) .end - -.sub 'infix:**' :multi(Integer,Integer) - .param num base - .param num exp - $N0 = pow base, exp - .return '!upgrade_to_num_if_needed'($N0) -.end - - ## symbolic unary .sub 'prefix:!' :multi(_) .param pmc a @@ -140,21 +131,13 @@ ## multiplicative .sub 'infix:*' :multi(_,_) - .param num a - .param num b - $N0 = a * b - .return ($N0) + .param pmc a + .param pmc b + $P0 = n_mul a, b + .return ($P0) .end -.sub 'infix:*' :multi(Integer,Integer) - .param num a - .param num b - $N0 = a * b - .return '!upgrade_to_num_if_needed'($N0) -.end - - .sub 'infix:/' :multi(_,_) .param num a .param num b