我正在尝试将«€»作为«$»标量的别名添加,我认为使用lang语来完成它是一种方法。但是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);
{}
}
Run Code Online (Sandbox Code Playgroud)
然后是一个使用它的程序(称为hello):
use lib "lib";
use ScalarEU;
sub MAIN ($name)
{
say "Hello, €name!";
}
Run Code Online (Sandbox Code Playgroud)
但这行不通,或者说行不通:
$ ./hello Tom
Hello, €name!
Run Code Online (Sandbox Code Playgroud)
(我以这种方式编写了程序,以免崩溃。)
我还没有添加动作类,但是“令牌标记”的设置方式应该不需要吗?但是这个假设是基于11年的文章,可能是错误的。
另外,https://github.com/rakudo/rakudo/issues/2404表示$ * LANG已过时,而改用$?LANG。REPL同意:
> $*LANG
Dynamic variable $*LANG not found
> $?LANG
(low-level object `Perl6::Grammar`)
Run Code Online (Sandbox Code Playgroud)
但是程序可以同时使用两者,而不会出错。(我试过了。)
简而言之:您必须更改nqp 对象$!target的字符串ParseShared,这会在解析时更改代码。
为什么: \nsigil令牌不再是原型,而是将rakudo/src/Perl6/Grammar.nqp定义为替代。
因此,作为一个最小的解决方案:token sigil { <[$@%&\xe2\x82\xac]> }但随之而来的是新问题:返回的值可以\xe2\x82\xac并且被用于其他语法中。
其中: \n因此您必须将nqp/src/QRegex/Cursor.nqp$<sigil>.Str中的定义更改为:
method Str() {\n $!pos >= $!from\n ?? nqp::substr(nqp::getattr_s($!shared, ParseShared, \'$!target\'),\n $!from, nqp::sub_i(self.to, $!from))\n !! \'\' }\nRun Code Online (Sandbox Code Playgroud)\n\n<- 含义The string in target between from and to if pos is not so low。
-> 所以我们必须$!target在$!from和$!to之间进行更改NQPMatch。
演示: \n这里是嵌入俚语语法的代码:
\n\ntoken sigil {\n | <[$@%&]>\n | <nogil> { say "Nogil returned: ", lk($/, \'nogil\').Str; }\n}\n\nmethod nogil {\n # The object to return\n my $cursor := self.nogil-proxy;\n\n # Get from cursor\n my $shared := nqp::getattr($cursor, NQPMatch, \'$!shared\');\n my $from = nqp::getattr_i($cursor, NQPMatch, \'$!from\');\n my $target = $cursor.target;\n\n # Replace in target current character (\xe2\x82\xac) by $\n $target.substr-rw($from, 1) = \'$\';\n\n # Set in cursor\n nqp::bindattr_s($shared, $shared.WHAT, \'$!target\', $target);\n\n # Return the "created by proxy" and modified NQPMatch\n return $cursor;\n}\n\ntoken nogil-proxy { \'\xe2\x82\xac\' }\nRun Code Online (Sandbox Code Playgroud)\n\n单独发言:_ \n它应该适合您的情况。在我的中,(没有印记)我仍然有问题,因为修改过程中大小的变化$!target会扰乱其他光标的to和from。在这种情况下:
$!from和$!to属性,以恢复银河系或至少在客户端代码中的和平。| 归档时间: |
|
| 查看次数: |
114 次 |
| 最近记录: |