Thank you for the report. This is now fixed. Fix: https://github.com/rakudo/rakudo/commit/97359ae42e Test: https://github.com/perl6/roast/commit/1ed4d128d2
It's worth noting the fix is somewhat tangental to the original issue and the issue isn't actually a bug. What happens in the original issue is you keep returning the same container for each item mapped over (in the case of S///, it was the $/ variable). And depending on how you fetch the results, you get the *latest* value of that container. The most curious example of this effect is: [12:40] <AlexDaniel> m: say <a1 a2 a3>.map({S/huh//}) [12:40] <+camelia> rakudo-moar 9a3c35: OUTPUT«(a1 a2 a3)» [12:40] <AlexDaniel> m: say eager <a1 a2 a3>.map({S/huh//}) [12:40] <+camelia> rakudo-moar 9a3c35: OUTPUT«(a3 a3 a3)» The first version is lazy, and the value inside $/ container is "used" somewhere in say before it gets updated to the next value. In the second version, the `eager` statement modifier gets rid of that lazines, so the `say` gets three items, all of them the $/ container, and so it naturally contains whatever the last value that was stored in it (in this case "a3"), which is why we get three items that are the same. The rest of the weirdness in this ticket is all due to the same reason, except it may appear to not be present due to laziness, or not appear on first iteration but then appear on second one, due to first version evaluated for each lazily generated value, but then those get stored in the list's $!reified attribute and keep getting updated to new values as the list is reified further. The result is only the second iteration notices those updates. Lastly, why is this ticket fixed now? We determined that S/// is actually not supposed to return $/. So for an unrelated reason it no longer returns the same container on multiple iterations, fixing this bug by a happy accident \o/ Cheers, ZZ