[perl #130859] [WEIRD] WhateverCode subscript inside WhateverCode inside block doesn't properly close over lexical

[email protected] ("Zoffix Znet via RT")
Newsgroups perl.perl6.compiler
Message-ID <[email protected]>
On Sat, 25 Feb 2017 06:55:02 -0800, [email protected] wrote:
> A WhateverCode containing an array subscript that is itself a
> WhateverCode, usually works fine... e.g. `*.[*-1]` always returns the
> last positional element of its argument.
> 
> A WhateverCode closing over a lexical variable usually works fine,
> e.g. `* - $x` always subtracts the *current* value of $x from its
> argument.
> 
> But when *both* of those features are combined, *and* the variable
> that is closed over is scoped to an outer block or routine that is
> called repeatedly, then it misbehaves:
> 
> sub f { my $x = ++$; (*.[* - $x])(<a b c>) }
> say (f,f,f);                                # (c c c)
> 
> The same, using `map`:
> 
> say (1..3).map: { (*.[* - $_])(<a b c>) };  # (c c c)
> 
> The expected output would be `(c b a)`. For some reason, it seems to
> use the first value of `$x` or `$_` for all three iterations.
> 
> ----------
> 
> Demonstration that the particular circumstances described above have
> to align for the bug to appear:
> 
> 1) If the WhateverCode subscript is replaced with a static expression,
> the bug disappears:
> 
> say (1..3).map: { (*.[3 - $_])(<a b c>) };  # (c b a)
> 
> 2) If the outer WhateverCode is removed by "inlining" it, the bug
> disappears:
> 
> say (1..3).map: { <a b c>[* - $_] };        # (c b a)
> 
> 3) If the `map` is unrolled so that there is no outer block that gets
> re-entered between invocations of the WhateverCode's, the bug
> disappears:
> 
> my &f = *.[* - $_];
> $_ = 1; say f <a b c>;  # c
> $_ = 2; say f <a b c>;  # b
> $_ = 3; say f <a b c>;  # a
> 
> ----------
> This is Rakudo version 2017.02-95-g0be724727 built on MoarVM version
> 2017.02-7-g3d859008 implementing Perl 6.c.


Thank you for the report. This is now fixed.

Fix:  https://github.com/rakudo/rakudo/commit/e8c6c259ce72fb5
Test: https://github.com/perl6/roast/commit/501f51b56c77fec06
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.