¿Cómo pasar parámetros a token referenciados por variable?


10

Puedo usar fácilmente las firmas de token usando el nombre del token directamente:

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

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

Sin embargo, no he encontrado una manera de hacer esto, cuando el token se almacena en variable:

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

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

Ambos dan:

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

¿Cuál es la sintaxis mágica para hacer eso?

Por cierto: incluso he examinado el conjunto de pruebas Raku y no incluye ese caso roast/S05-grammar/signatures.t.

Respuestas:


8

Ya sea:

  • Use la solución en la respuesta de jnthn para que Raku sepa explícitamente que desea usar su $variable de símbolo sigil'd como a Callable.

  • Declare la variable como explícitamente Callableen primer lugar y realice el cambio correspondiente en la llamada:

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

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

2
Podría ser útil señalar que los tokens son simplemente expresiones regulares con ciertos atributos establecidos, y las expresiones regulares son, a su vez, invocables, por lo tanto, pueden entrar en &variables.
user0721090601

1
¡Gracias! Mientras que jnthn respondió mi pregunta muy directamente, estoy marcando esta como respuesta, porque enfatiza la causa real de mi problema: sigilo incorrecto. Tratar el token como invocable desde el principio es una solución mucho más limpia.
Pawel Pabian bbkr

11

Coloque un &antes de la variable:

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

El analizador busca el &, y luego delega a la regla de análisis variable Raku, que analizará felizmente un contextualizador como este.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.