Hi!
By playing with slangs I stumbled upon pretty confusing issue. I have a module
with a test slang which looks like this:
class My::Metamodel::MyHOW is Metamodel::ClassHOW {
method compose (|) {
note "My compose";
nextsame;
}
}
sub EXPORT {
use nqp;
use NQPHLL:from<NQP>;
my role MySlang {
token package_declarator:sym<myclass> {
:my $*OUTERPACKAGE := self.package;
:my $*PKGDECL := 'myclass';
:my $*LINE_NO := HLL::Compiler.lineof(self.orig(),
self.from(), :cache(1));
<sym><.kok>
<package_def>
<.set_braid_from(self)>
}
}
my role MyActions {
method package_declarator:sym<myclass>(Mu $/) {
$/.make( nqp::atkey(nqp::findmethod($/, 'hash')($/),
'package_def').ast );
}
}
$ = $*LANG.refine_slang( 'MAIN', MySlang, MyActions );
$*LANG.set_how('myclass', My::Metamodel::MyHOW);
{}
}
And when it's used in a script:
use lib '.';
use myslang;
myclass My {
method foo { say "!foo" }
}
My.new.foo;
everything works as expected, I get this output:
My compose
!foo
Then I define a module smodule.pm6:
use myslang;
myclass Foo {
}
And load it dynamically with 'require':
require ::('smodule');
only to get this:
My compose
===SORRY!===
Missing serialize REPR function for REPR MVMContext (BOOTContext)
Now I wonder if it's a bug or I'm missing a thing or two in what I'm doing? So
far, basic guidelines of adding a new package type were taken from World.nqp
add_package_declarator method which does some extra work some of which is
clearly not needed in my case; and some perhaps necessary but I don't
understand it yet.
Best regards,
Vadim Belman