in reply to Re^6: Small Perl 6 discoveries II, Rats
in thread [Perl6] Small discoveries I, __DATA__

To prevent the numerator and denominator from becoming pathologically large, the denominator is limited to 64 bit storage

Well, that doesn't seem to be the case with (latest) rakudo-star-2017.07:
> my $x=9.999999999999999999999999999999999999999999999.Rat; $x.nude (9999999999999999999999999999999999999999999999 1000000000000000000000 +000000000000000000000000) > $x.WHAT (Rat)
but the base 10 denominator of 1000000000000000000000000000000000000000000000 is a 150-bit value.

The documentation also concludes with "Rat objects are immutable" - yet the following operation converts $x from a Rat to a FatRat:
> $x *= 0.3.FatRat; $x.nude (29999999999999999999999999999999999999999999997 100000000000000000000 +00000000000000000000000000) > $x.WHAT (FatRat)
Am I misunderstanding that documentation ?
Is there a way of interpreting the documentation such that it does match the above behaviours ?

Cheers,
Rob

Replies are listed 'Best First'.
Re^8: Small Perl 6 discoveries II, Rats
by raiph (Deacon) on Oct 24, 2017 at 02:55 UTC
    the following operation converts $x from a Rat to a FatRat

    That's a a mutable "container" aka a variable (a Scalar in this case) containing one immutable value (a Rat) then another immutable value (a FatRat).

    # Declare a new identifier $x and bind it to a new mutable Scalar cont +ainer: my $x; # Assign a value into the Scalar: $x # An LHS reference to a Scalar returns the Scalar. = # = is assignment. The LHS decides what to do with i +t. 9.9; # Creates a new immutable Rat. # VAR macro returns what the identifier is bound to: say $x.VAR.^name; # Scalar -- the type of variable bound to $x. # All other uses of $x or a Scalar on RHS return the value assigned in +to the Scalar: say $x; # 9.9 say $x.^name; # Rat -- the type of the value assigned into the Sca +lar. $x *= 2; # This is equivalent to ... $x = $x * 2; # ... which assigns result of RHS expression into Sc +alar on LHS. say $x; # 39.6

    Hth.

      That's a mutable "container" aka a variable (a Scalar in this case) containing one immutable value

      I really do not understand the use of the term "immutable".
      Is it perhaps meant to be some shorthand method of signifying that the numerator and denominator are co-prime ? (For this, the gmp C library documentation uses the term "canonical" - in the sense, I think, of "authoritative, standard, accepted".)
      Admittedly, the connection between the meanings of "co-prime" and "immutable" seems very tenuous to me, but it's about all that I can come up with.

      Cheers,
      Rob
        One thing's for sure -- you're confused! I apologize if the following still doesn't help and/or is aggravating.

        I really do not understand the use of the term "immutable".

        To me it means "never changes".

        There are three exceptions:

        Construction

        A data item must go from uninitialized/undefined to initialized/defined:

        my $foo := 42; # declares $foo at compile time, binds it to immutable +42 at run-time BEGIN say $foo; # (Any) $foo = 99; # Cannot assign to an immutable value

        Destruction

        Memory is of course reclaimed at the end of a process at the latest if not garbage collected earlier (when no more references to it exist).

        Referencing mutable data

        One can have a reference that is itself immutable but which refers to mutable data. (Rats aren't mutable. So please don't think "ah, maybe this is the issue". I'm just trying to be complete in elaborating on the precise meaning of "immutable" in P6.) Thus:

        my @foo := (42, $); @foo[1] = 99; say @foo; # (42 99) @foo[0] = 99; # Cannot modify an immutable Int

        If your light bulb still hasn't lit up at least a little, perhaps it really is best for you to just wait until materials about P6 sufficiently improve (maybe years? maybe never?) and you have time to enjoy exploring them. (I don't think anyone can absorb new information well unless they're enjoying the process and it feels like you're very much not enjoying this at any level. I apologize if I've got that wrong.)

        Alternatively, perhaps you could pick a line from my earlier comment in which I broke things down into tiny pieces, one that isn't clear to you, and we can then try to clear that up, and then another line, and so on?

      You can give $x a type, but prepare to be disappointed.
      > my Rat $x = 0.1; > $x *= 0.1.FatRat; Type check failed in assignment to $x; expected Rat but got FatRat (Fa +tRat.new(1, 100))
        Yeah, well. That is to be expected as it is akin to assigning an int64 to an int32. What surprises me is that
        perl6 -e "my FatRat $r = 0.1"
        throws the same error.


        holli

        You can lead your users to water, but alas, you cannot drown them.
        Type check failed in assignment to $x; expected Rat but got FatRat

        At least that Rat appears to be immutable ;-)

        I need to study the documentation and spend some time working through it.

        Cheers,
        Rob