Как передать параметры токену, на который ссылается переменная?

10

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

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 '>'

Какой магический синтаксис для этого?

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

Павел Пабиан BBKR
источник

Ответы:

8

Или:

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

  • Объявите переменную как явно находящуюся Callableна первом месте и внесите соответствующее изменение в вызов:

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

say 'axb' ~~ / 'a' <&t: 'x'> 'b' /;   # 「axb」
say 'axb' ~~ / 'a' <&t( 'x' )> 'b' /; # 「axb」
raiph
источник
2
Может быть полезно указать, что токены просто regexen с определенными установленными атрибутами, а regexen, в свою очередь, Callables, следовательно, они могут входить в &переменные.
user0721090601
1
Спасибо! Хотя jnthn ответил на мой вопрос очень прямо, я помечаю этот вопрос как ответ, потому что он подчеркивает реальную причину моей проблемы - неправильный сигил. Рассматривать токен как Callable с самого начала - гораздо более чистое решение.
Павел Пабиан BBKR
11

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

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

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

Джонатан Уортингтон
источник