On Fri, 08 Sep 2017 18:37:50 -0700, [email protected] wrote:
>
> > my @h
> []
> > @h.splice: 0, 0, 1.Seq
> []
> > @h[0].VAR.WHAT
> (Int)
> > @h[0] = 5
> Cannot modify an immutable Int (1)
> in block <unit> at <unknown file> line 1
>
> I got hit by this with: @a.splice: 0, 0, Any xx 2
Good find.
It's also not specific to `Seq` - it looks like it happens whenever the
replacement elements are passed to `splice` as a nested structure rather than
as flat arguments:
my @h;
@h.splice: 0, 0, 'a';
@h.splice: 1, 0, ('b',);
dd @h; # Array @h = ["a", "b"]
say @h[0].VAR.^name; # Scalar
say @h[1].VAR.^name; # Str
Conceptually¹⁺², the `splice` routine takes the replacements as a `*@` slurpy,
so whether they're passed in nested or flat form should not matter.
But Rakudo currently implements the routine with a `| is raw` signature:
say Array.^find_method("splice").signature; # (Mu $: | is raw)
...and apparently does the parameter flattening manually, in a way that
introduces this bug.
Until it is fixed, a work-around is to flatten the replacement elements into
the argument list of `splice` using `|`:
@a.splice: 0, 0, |(Any xx 2);
---
[1] https://docs.perl6.org/routine/splice
[2] https://design.perl6.org/S32/Containers.html#splice