Как передать параметры токену, на который ссылается переменная? - PullRequest
10 голосов
/ 09 января 2020

Я легко могу использовать подписи токена, напрямую используя имя токена:

my token t ( $x ) { $x };

'axb' ~~ / 'a' <t: 'x'> 'b' /;      # match
'axb' ~~ / 'a' <t( 'x' )> 'b' /;    # match

Однако я не нашел способа сделать это, когда токен хранится в переменной:

my $t = token ( $x ) { $x };

'axb' ~~ / 'a' <$t: 'x'> 'b' /;
'axb' ~~ / 'a' <$t( 'x' )> 'b' /;

Оба дают:

===SORRY!=== Error while compiling ...
Unable to parse expression in metachar:sym<assert>; couldn't find final '>'

Что такое синтаксис magi c для этого?

Кстати: я даже просматривал набор тестов Raku, и он не включает такой случай в roast/S05-grammar/signatures.t.

Ответы [ 2 ]

11 голосов
/ 09 января 2020

Поместите & перед переменной:

my $t = token ( $x ) { $x };
say 'axb' ~~ / 'a' <&$t: 'x'> 'b' /;
say 'axb' ~~ / 'a' <&$t( 'x' )> 'b' /;

Анализатор ищет &, а затем делегирует правило разбора переменной Raku, которое с радостью проанализирует контекстуализатор, подобный этому.

8 голосов
/ 09 января 2020

Либо:

  • Используйте решение в ответе jnthn, чтобы Raku явно знал, что вы будете sh использовать вашу переменную $ sigil'd token в качестве Callable.

  • Сначала объявите переменную как Callable и внесите соответствующее изменение в вызов:

my &t = token ( $x ) { $x };

say 'axb' ~~ / 'a' <&t: 'x'> 'b' /;   # 「axb」
say 'axb' ~~ / 'a' <&t( 'x' )> 'b' /; # 「axb」
...