Perl6: добавление сигил со сленгом - PullRequest
6 голосов
/ 09 марта 2019

Я пытаюсь добавить «€» в качестве псевдонима для скаляра «$», и я думаю, что делать это со сленгом - это способ сделать это. Но в perl6.doc сленги вообще не упоминаются.

Я прочитал следующее:

И посмотрел на модули 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);

  {}
}

Затем программа (называемая привет), использующая его:

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`)

Но программы могут использовать оба без ошибок. (Я пытался.)

...