in reply to Re^2: Perl 6 and performance
in thread Perl 6 and performance

To clarify things, 1. is not a valid number in Perl 6. 1.0 is a Rat, 1e0 or 1.0e0 are Num.

I've also tried to explicitly declare the loop variable as a floating point:

There are two issues with it. The first is that you don't declare the loop variable to be a Num, but an outer variable of the same name. In -> $i { ... } the part between the arrow and the block is a signature, which declares a new variable. So it's like writing

my Num $i; sub ($i) { # new $i here }

A way to fix that is writing -> Num $i { }, but then you get a type check failure because 1..1000 indeed produces Ints, not Nums. So either you coerce to Num somewhere (for example $i.Num ** 2), or you write the range as 1e0 .. 1e3.

I admit that I posed the original question in a slightly more trollish way than necessary, and I apologize for the inconvenience I might have created. I didn't intend to denigrate the effort of the Perl 6 developers - an effort which is nothing short of heroic.

My side remark was more about _foo's trolling, not about your original question, which I think is 100% valid, and a good bug report at that. Sorry if that came out wrong on my part. User feedback like yours is what we need, and one of the reasons for making the star releases in the first place.

Replies are listed 'Best First'.
Re^4: Perl 6 and performance
by kikuchiyo (Hermit) on Feb 09, 2012 at 21:00 UTC
    To clarify things, 1. is not a valid number in Perl 6. 1.0 is a Rat, 1e0 or 1.0e0 are Num.

    This is news to me. In most languages 1.0 is the syntax used to denote floating point constants.

    ...I am aware that Perl 6 is not most languages, but for people coming from those languages, this feature will be somewhat surprising.

    A way to fix that is writing -> Num $i { }, but then you get a type check failure because 1..1000 indeed produces Ints, not Nums. So either you coerce to Num somewhere (for example $i.Num ** 2), or you write the range as 1e0 .. 1e3.
    Excellent. However:
    ./perl6 -e 'my Num $s;for 1e0..1e3 -> Num $i {$s+=1e0/$i**2};say $s' Nominal type check failed for parameter '$i'; expected Num but got Int + instead
    User feedback like yours is what we need, and one of the reasons for making the star releases in the first place.

    Glad to have been of help then. By the way, the performance increase is noticeable in the new release, and I guess it will only get better, and the effect of further optimizations will be compounded, as Rakudo itself is mostly written in Perl 6.

    About 1.6 orders of magnitude of performance increase down, 2.6 to get to the level of Perl 5, or 1.6 to overtake Ruby. :)

      ./perl6 -e 'my Num $s;for 1e0..1e3 -> Num $i {$s+=1e0/$i**2};say $s' Nominal type check failed for parameter '$i'; expected Num but got Int + instead

      Oops, that's a bug in Rakudo. I've opened a ticket for it. Now that's the second piece of valuable feedback you've given us. Thanks again.

      Update: I have fixed this bug, so the code with -> Num $i { ... } will work in the next release.