-
Notifications
You must be signed in to change notification settings - Fork 13
Description
The following code produces consistent results:
grammar G { token TOP { \w+ } }
sub summarize() {
("aaa" .. "zzz").map( {
my $result = G.parse($_);
$result.Str.comb.Set.keys.ords.sum # something to keep CPU busy
} ).sum
}
say summarize; # 6615297
However, if we put a .race
or a .hyper
in the mix (as in ("aaa" .. "zzz").race.map( {
), the results become random with only occasionally producing the correct result.
This can be fixed by adding a my $/
inside the code block of the .map
. Or by changing the block to a proper sub
(("aaa" .. "zzz").map( sub ($_) {
).
So clearly this problem is caused by the block in the map
not having its own lexical $/
, so that G.parse
is setting the $/
that is implicitly defined outside the block, inside sub summarize
.
In 6.e currently Grammar.parse (and friends) will not set $/
, and then the above code will work as it should. However, that is a breaking change that we may not want to keep. On the other hand we may want to keep this change to reduce "action at a distance" more generally.