Skip Menu |
Report information
Id: 122838
Status: open
Priority: 0/
Queue: perl6

Owner: Nobody
Requestors: masak <cmasak [at] gmail.com>
Cc:
AdminCc:

Severity: (no value)
Tag: Bug
Platform: (no value)
Patch Status: (no value)
VM: (no value)



Subject: [BUG] BEGIN GLOBAL::<name> assignment does not work in Rakudo
Date: Wed, 24 Sep 2014 13:02:44 +0200
From: Carl Mäsak <cmasak [...] gmail.com>
To: rakudobug [...] perl.org
Download (untitled) / with headers
text/plain 1.1k
<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
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:
Show quoted text
> <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


From: Elizabeth Mattijsen <liz [...] dijkmat.nl>
Subject: Re: [perl #122838] [BUG] BEGIN GLOBAL::<name> assignment does not work in Rakudo
To: perl6-bugs-followup [...] perl.org
Date: Sun, 3 Dec 2017 17:50:24 +0100
Download (untitled) / with headers
text/plain 2.4k
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. Show quoted text
> On 3 Dec 2017, at 11:23, Aleks-Daniel Jakimenko-Aleksejev via RT <perl6-bugs-followup@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


This service is sponsored and maintained by Best Practical Solutions and runs on Perl.org infrastructure.

For issues related to this RT instance (aka "perlbug"), please contact perlbug-admin at perl.org