On Tue, 30 Jan 2018 19:03:13 -0800, c...@zoffix.com wrote: > On Tue, 30 Jan 2018 15:08:38 -0800, c...@zoffix.com wrote: > > On Fri, 01 Dec 2017 12:09:05 -0800, alex.jakime...@gmail.com wrote: > > > Still reproducible (2017.11, HEAD(5929887)), but is supposed to > > > work? > > > > Don't see any reason why that'd be questionable. > > > > > On 2015-02-09 17:43:52, rayd...@cyberuniverses.com wrote: > > > > m: my $a; BEGIN { $a := 1; say $a; }; say $a; > > > > rakudo-{parrot,moar} 0cb22e: OUTPUT«1(Any)» > > > > > > > > m: my $a; BEGIN { $a = 1; say $a; }; say $a; # works with > > > > assignment > > > > rakudo-{parrot,moar} 0cb22e: OUTPUT«11» > > > > > > Another manifestation of the same bug: > > > > <Zoffix__> m: BEGIN { my $a1 := 42; say $a1; } > > <camelia> rakudo-moar deffe54b8: OUTPUT: «42» > > <Zoffix__> m: BEGIN { my $a1 = 42; say $a1; } > > <camelia> rakudo-moar deffe54b8: OUTPUT: «42» > > <Zoffix__> m: BEGIN my $a1 = 42; say $a1; > > <camelia> rakudo-moar deffe54b8: OUTPUT: «42» > > <Zoffix__> m: BEGIN my $a1 := 42; say $a1; > > <camelia> rakudo-moar deffe54b8: OUTPUT: «(Mu)» > > > > Tracked this to Perl6::World.compile_in_context but leaving it there, > as it's getting too hard. > Need to gain a few levels first. > > The comment in the method reads: > # Create outer lexical contexts with all symbols visible. Maybe > # we can be a bit smarter here some day. But for now we just make a > # single frame and copy all the visible things into it. > > So I imagine the binding gets made to this faked out block and never > propagates back to the source where all the lexicals were copied from.
More comments: https://irclog.perlgeek.de/perl6/2018-02-02#i_15769787 15:11 jnthn Zoffix: Yeah. Lexpads are immutable, and when we compile a BEGIN we obviously haven't finished the outer block yet, so we have to fake something up. But what? Containers are cloned from a "prototype", and the fake lexpad contains the static container. Thus what's actually happening is that on entry to the scope post-compilation, the Scalar is cloned complete with the value set in the prototype. 15:12 Of course, binding doesn't have that level of indirection so there's no way it can work. 15:12 We should perhaps detect it at compile time and say it can't work. Or...we could try diffing the scope after each BEGIN block and trying to somehow propagate bindings.