On Sun, 01 Jan 2017 10:11:57 -0800, [email protected] wrote:
> This statement
>
> my @stuff = "\x0"... "\xfff"
>
> hangs the REPL for a while. In fact, memory as reported by top goes up to 1
> GB and increases slowly but firmly. This happens whatever the start of the
> range and for a few characters.
>
> Ob versions:
> This is Rakudo version 2016.09-68-g447d592 built on MoarVM version
> 2016.09-1-gdebb859
Thank you for the report, however this is not a bug.
There are two things at play that cause the hang:
1) As samcv mentions above, the way you're assigning to the array makes it
reify all the elements. You can use either `my @stuff := "\x0"..."\xfff"` or
`my $stuff = ("\x0"..."\xfff")` or `my @stuff = lazy "\x0" ..."\xfff"` to avoid
this issue.
2) So even though it's reifying everything, the next obvious question is why is
it doing it forever? That it due to sequences by default using `.succ` method
here, and there exist ranges infinitely repeated ranges because the char of a
`.succ` of one char becomes normalized and its .succ is actually prior to that
first char.
If you run this code, you can see that after \x[33F], the next char is \x[300]
and it loops in that range. That's the normalization biting you.
my @stuff = lazy "\x0" ... "\xfff"; .ord.base(16).say for @stuff
If you need a list of chars between \x0 and \xfff; you can generate the numeric
sequence and then use a map to convert to to chars:
my @stuff = map *.chr, lazy 0 ... 0xfff; .say for @stuff
Cheers,
ZZ