[perl #123776] Binding a variable at BEGIN time doesn't stick aruond for runtime

2018-02-02 Thread Zoffix Znet via RT
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«1␤1␤»
> >
> >
> > Another manifestation of the same bug:
> >
> >  m: BEGIN { my $a1 := 42; say $a1; }
> >  rakudo-moar deffe54b8: OUTPUT: «42␤»
> >  m: BEGIN { my $a1 = 42; say $a1; }
> >  rakudo-moar deffe54b8: OUTPUT: «42␤»
> >  m: BEGIN my $a1 = 42; say $a1;
> >  rakudo-moar deffe54b8: OUTPUT: «42␤»
> >  m: BEGIN my $a1 := 42; say $a1;
> >  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.


[perl #123776] Binding a variable at BEGIN time doesn't stick aruond for runtime

2018-01-30 Thread Zoffix Znet via RT
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«1␤1␤»
> 
> 
> Another manifestation of the same bug:
> 
>  m: BEGIN { my $a1 := 42; say $a1; }
>  rakudo-moar deffe54b8: OUTPUT: «42␤»
>  m: BEGIN { my $a1 = 42; say $a1; }
>  rakudo-moar deffe54b8: OUTPUT: «42␤»
>  m: BEGIN my $a1 = 42; say $a1;
>  rakudo-moar deffe54b8: OUTPUT: «42␤»
>  m: BEGIN my $a1 := 42; say $a1;
>  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.



[perl #123776] Binding a variable at BEGIN time doesn't stick aruond for runtime

2018-01-30 Thread Zoffix Znet via RT
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«1␤1␤»
> 
> 
> Another manifestation of the same bug:
> 
>  m: BEGIN { my $a1 := 42; say $a1; }
>  rakudo-moar deffe54b8: OUTPUT: «42␤»
>  m: BEGIN { my $a1 = 42; say $a1; }
>  rakudo-moar deffe54b8: OUTPUT: «42␤»
>  m: BEGIN my $a1 = 42; say $a1;
>  rakudo-moar deffe54b8: OUTPUT: «42␤»
>  m: BEGIN my $a1 := 42; say $a1;
>  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.