Come passare i parametri al token a cui fa riferimento la variabile?


10

Posso facilmente usare le firme dei token usando direttamente il nome del token:

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

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

Tuttavia, non ho trovato un modo per farlo, quando il token è archiviato nella variabile:

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

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

Entrambi danno:

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

Qual è la sintassi magica per farlo?

A proposito: ho anche sfogliato la suite di test Raku e non include questo caso roast/S05-grammar/signatures.t.

Risposte:


8

O:

  • Usa la soluzione nella risposta di jnthn per far sapere esplicitamente a Raku che desideri utilizzare la tua $variabile token sigil'd come a Callable.

  • Dichiarare la variabile come esplicitamente Callablein primo luogo e apportare la modifica corrispondente nella chiamata:

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

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

2
Potrebbe essere utile sottolineare che i token sono solo regexen con determinati attributi impostati e che i regexen sono, a loro volta, callable, quindi possono andare in &variabili.
user0721090601

1
Grazie! Mentre jnthn ha risposto alla mia domanda molto direttamente, sto contrassegnando questa come una risposta, perché sottolinea la vera causa del mio problema: il sigillo sbagliato. Trattare il token come Callable dall'inizio è una soluzione molto più pulita.
Pawel Pabian bbkr

11

Inserisci un &prima della variabile:

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

Il parser cerca il &, e quindi delega alla regola di analisi delle variabili di Raku, che analizzerà felicemente un contestualizzatore come questo.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.