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
> <[email protected]> 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