Wie übergebe ich Parameter an ein Token, auf das durch eine Variable verwiesen wird?

10

Ich kann Token-Signaturen einfach verwenden, indem ich den Token-Namen direkt verwende:

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

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

Ich habe jedoch keine Möglichkeit gefunden, dies zu tun, wenn das Token in einer Variablen gespeichert ist:

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

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

Beide geben:

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

Was ist die magische Syntax dafür?

Übrigens: Ich habe sogar die Raku-Testsuite durchsucht und sie enthält einen solchen Fall nicht roast/S05-grammar/signatures.t.

Pawel Pabian bbkr
quelle

Antworten:

8

Entweder:

  • Verwenden Sie die Lösung in jnthns Antwort, um Raku explizit mitzuteilen, dass Sie Ihre $sigil'd-Token-Variable als verwenden möchten Callable.

  • Deklarieren Sie die Variable als explizit Callablean erster Stelle und nehmen Sie die entsprechende Änderung im Aufruf vor:

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

say 'axb' ~~ / 'a' <&t: 'x'> 'b' /;   # 「axb」
say 'axb' ~~ / 'a' <&t( 'x' )> 'b' /; # 「axb」
Raiph
quelle
2
Könnte nützlich sein, um darauf hinzuweisen, dass Token nur mit bestimmten Attributen regexen sind und Regexen wiederum Callables sind, daher können sie in &Variablen umgewandelt werden.
user0721090601
1
Vielen Dank! Während jnthn meine Frage sehr direkt beantwortete, markiere ich diese als Antwort, weil sie die wahre Ursache meines Problems hervorhebt - falsches Siegel. Token von Anfang an als aufrufbar zu behandeln, ist eine viel sauberere Lösung.
Pawel Pabian bbkr
11

Stellen Sie ein &vor die Variable:

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

Der Parser sucht nach der &und delegiert dann an die Raku-Variablen- Parser- Regel, die einen Kontextualisierer wie diesen gerne analysiert.

Jonathan Worthington
quelle