Comment passer des params au token référencé par variable?


10

Je peux facilement utiliser des signatures de jeton en utilisant directement le nom du jeton:

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

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

Cependant, je n'ai pas trouvé de moyen de le faire, lorsque le jeton est stocké dans une variable:

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

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

Les deux donnent:

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

Quelle est la syntaxe magique pour faire ça?

BTW: J'ai même parcouru la suite de tests Raku et elle n'inclut pas ce cas dans roast/S05-grammar/signatures.t.

Réponses:


8

Soit:

  • Utilisez la solution dans la réponse de jnthn pour indiquer explicitement à Raku que vous souhaitez utiliser votre $variable de jeton sigil comme a Callable.

  • Déclarez la variable comme étant explicitement Callableen premier lieu et effectuez la modification correspondante dans l'appel:

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

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

2
Cela pourrait être utile pour souligner que les jetons ne sont que des regexen avec certains attributs définis, et que les regexen sont, à leur tour, Callables, donc ils peuvent entrer dans des &variables.
user0721090601

1
Merci! Bien que jnthn ait répondu très directement à ma question, je signale celle-ci comme une réponse, car elle met l'accent sur la véritable cause de mon problème - un mauvais sigil. Traiter le jeton comme appelable dès le départ est une solution beaucoup plus propre.
Pawel Pabian bbkr

11

Placez un &avant la variable:

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

L'analyseur recherche le &, puis délègue la règle d'analyse de variable Raku, qui analysera avec plaisir un contextualiseur comme celui-ci.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.