我正在尝试将«€»作为«$»标量的别名添加,我认为使用a语来完成它是一种方法。但是perl6.doc根本没有提到S语。
我已阅读以下内容:
并查看了Slang :: Roman和Slang :: Tuxic模块。
结果是此文件(ScalarEU.pm6):
use nqp;
unit module ScalarEU2;
sub EXPORT(|)
{
my role Euscalar
{
token sigil:sym<$> { '€' | '$' }
}
my Mu $MAIN-grammar := nqp::atkey(%*LANG, 'MAIN');
my $grammar := $MAIN-grammar.HOW.mixin($MAIN-grammar, Euscalar);
$*LANG.define_slang('MAIN', $grammar, $*LANG.actions);
{}
}
然后使用它的程序(称为hello):
use lib "lib";
use ScalarEU;
sub MAIN ($name)
{
say "Hello, €name!";
}
但是它不起作用,或者说,它没有做应做的事情:
$ ./hello Tom
Hello, €name!
((我以这种方式编写了程序,以免崩溃。)
我还没有添加动作类,但是设置“令牌标记”的方式应该不需要吗?但是这个假设是基于11年的文章,可能是错误的。
[此外,https://github.com/rakudo/rakudo/issues/2404说$ * LANG已过时,而改用$?LANG。 REPL同意:
> $*LANG
Dynamic variable $*LANG not found
> $?LANG
(low-level object `Perl6::Grammar`)
但是程序可以同时使用两者,而不会出错。 (我已经尝试过。)
sigil
标记不再是原型,而是将here定义为替代。
所以作为最小的解决方案:token sigil { <[$@%&€]> }
,但是随后出现了新问题...