If you normally create a class, the entry in GLOBAL:: is decontainerized:

$ 6 'class Test {}; use nqp; dd nqp::iscont(GLOBAL::<Test>)’
0

However, if you just assign to a key in GLOBAL::, the result *is* containerized:

$ 6 'BEGIN GLOBAL::<Test> = class { }; use nqp; dd nqp::iscont(GLOBAL::<Test>)’
1

So maybe you should just bind to the key in GLOBAL:: ?

$ 6 'BEGIN GLOBAL::<Test> := class { }; dd Test.new'
<anon|140404516236960>.new

Now, perhaps this can be fixed by having a nqp::decont() somewhere deep in the 
bowels for every reference to something in GLOBAL::  .  But I fear that, even 
if it only a little bit of overhead, it’s overhead we don’t need.

An alternate option would be to create a Stash.ASSIGN-KEY that would not create 
a container, but instead would bind.  But that also feels a bit too magical to 
me.

So I think we should mark this ticket as “DIHWIDT”, and point to the workaround 
of binding.


> On 3 Dec 2017, at 11:23, Aleks-Daniel Jakimenko-Aleksejev via RT 
> <perl6-bugs-follo...@perl.org> wrote:
> 
> As of today (2017.11,HEAD(e5b660e)) it prints this:
> 
> Cannot call method 'new' on a null object
> in block <unit> at -e line 1
> 
> Which is arguably reasonable, but I guess it's not good enough.
> 
> On 2014-09-24 04:03:12, masak wrote:
>> <nine> m: BEGIN GLOBAL::<Test> = class { }; Test.new;
>> <camelia> rakudo-moar 682e03: OUTPUT«===SORRY!===␤Object of type
>> <anon> in QAST::WVal, but not in SC␤»
>> <masak> nine: looks like a bug.
>> <nine> masak: any idea how I can create a class with a fully qualified
>> name from an EVAL that's deep in some other namespace?
>> <nine> masak: as in Inline::Perl5::Perl6PackageCreator::create runs an
>> EVAL that should create a class called Foo::Bar::Baz.
>> <lizmat> nine: EVAL "class Foo::Bar::Baz {}" doesn't cut it ?
>> <lizmat> alternately EVAL "class Foo { class Bar { class Baz {}}}' ?
>> <lizmat> or actually, maybe both?
>> <nine> lizmat: nope, that creates
>> Inline::Perl5::Perl6PackageCreator::Foo::Bar::Baz (what a handy name
>> ;)
>> <nine> m: BEGIN GLOBAL::<Test> := class { }; Test.new;
>> <camelia> rakudo-moar 682e03: ( no output )
>> <nine> ah, := works, while = does not
>> <jnthn> nine: Does class GLOBAL::Foo::Bar::Baz { } not do it?
>> <nine> jnthn: no, the GLOBAL:: is pretty much ignored
>> <jnthn> ah
>> <jnthn> Maybe that wants fixing
>> <jnthn> But afer dinner
>> * masak submits rakudobug
>> <nine> jnthn: according to S10, GLOBAL:: should do it though
>> <jnthn> nine: That's my feeling too

Reply via email to