Como passar parâmetros para o token referenciado pela variável?

10

Posso usar facilmente assinaturas de token usando o nome do token diretamente:

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

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

No entanto, eu não encontrei uma maneira de fazer isso, quando o token é armazenado na variável:

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

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

Ambos dão:

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

Qual é a sintaxe mágica para fazer isso?

BTW: Eu até naveguei pelo conjunto de testes Raku e ele não inclui esse caso roast/S05-grammar/signatures.t.

Pawel Pabian bbkr
fonte

Respostas:

8

Ou:

  • Use a solução na resposta de jnthn para informar Raku explicitamente que você deseja usar sua $variável de token sigil'd como a Callable.

  • Declare a variável como explicitamente Callableem primeiro lugar e faça a alteração correspondente na chamada:

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

say 'axb' ~~ / 'a' <&t: 'x'> 'b' /;   # 「axb」
say 'axb' ~~ / 'a' <&t( 'x' )> 'b' /; # 「axb」
raiph
fonte
2
Pode ser útil salientar que os tokens são apenas reavaliados com certos atributos definidos, e os regexen são, por sua vez, Callables, portanto, eles podem entrar em &variáveis.
user0721090601 9/01
11
Obrigado! Enquanto jnthn respondeu minha pergunta muito diretamente, estou sinalizando esta como resposta, porque enfatiza a causa real do meu problema - sigilo errado. Tratar o token como Callable desde o início é uma solução muito mais limpa.
Pawel Pabian bbkr
11

Coloque um &antes da variável:

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

O analisador procura &e, em seguida, delega para a regra de análise de variáveis ​​Raku, que analisará felizmente um contextualizador como este.

Jonathan Worthington
fonte