Perl6:使用S语添加标记

Arn*_*mer 6 perl6

我正在尝试将«€»作为«$»标量的别名添加,我认为使用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)

但是程序可以同时使用两者,而不会出错。(我试过了。)

tin*_*ino 1

简而言之:您必须更改nqp 对象$!target的字符串ParseShared,这会在解析时更改代码。

\n\n

为什么: \nsigil令牌不再是原型,而是将rakudo/src/Perl6/Grammar.nqp定义为替代。

\n\n

因此,作为一个最小的解决方案:token sigil { <[$@%&\xe2\x82\xac]> }但随之而来的是新问题:返回的值可以\xe2\x82\xac并且被用于其他语法中。

\n\n

其中: \n因此您必须将nqp/src/QRegex/Cursor.nqp$<sigil>.Str中的定义更改为:

\n\n
method Str()       {\n   $!pos >= $!from\n        ?? nqp::substr(nqp::getattr_s($!shared, ParseShared, \'$!target\'),\n            $!from, nqp::sub_i(self.to, $!from))\n        !! \'\' }\n
Run Code Online (Sandbox Code Playgroud)\n\n

<- 含义The string in target between from and to if pos is not so low

\n\n

-> 所以我们必须$!target$!from$!to之间进行更改NQPMatch

\n\n

演示: \n这里是嵌入俚语语法的代码:

\n\n
token 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\' }\n
Run Code Online (Sandbox Code Playgroud)\n\n

单独发言:_ \n它应该适合您的情况。在我的中,(没有印记)我仍然有问题,因为修改过程中大小的变化$!target会扰乱其他光标的tofrom。在这种情况下:

\n\n
    \n
  1. 我必须覆盖 NQPMatch.Str 函数(希望这是可能的)。
  2. \n
  3. 我必须列出光标(如果可能)并明智地更改它们$!from$!to属性,以恢复银河系或至少在客户端代码中的和平。
  4. \n
\n