Jak przekazać parametry do tokena, do którego odwołuje się zmienna?

10

Mogę łatwo korzystać z sygnatur tokenów, używając bezpośrednio nazwy tokena:

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

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

Jednak nie znalazłem sposobu, aby to zrobić, gdy token jest przechowywany w zmiennej:

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

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

Oba dają:

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

Jaka jest magiczna składnia, aby to zrobić?

BTW: Przeglądałem nawet pakiet testowy Raku i nie zawiera takiego przypadku roast/S05-grammar/signatures.t.

Paweł Pabian bbkr
źródło

Odpowiedzi:

8

Zarówno:

  • Skorzystaj z rozwiązania zawartego w odpowiedzi jnthna, aby Raku wyraźnie wiedział, że chcesz użyć swojej $zmiennej znacznika sigil jako Callable.

  • Zadeklaruj zmienną jako wyraźnie znajdującą się Callablena pierwszym miejscu i wprowadź odpowiednią zmianę w wywołaniu:

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

say 'axb' ~~ / 'a' <&t: 'x'> 'b' /;   # 「axb」
say 'axb' ~~ / 'a' <&t( 'x' )> 'b' /; # 「axb」
raiph
źródło
2
Może się przydać, aby wskazać, że tokeny są po prostu wyrażeniami regularnymi z pewnymi ustawionymi atrybutami, a wyrażenia regularne są z kolei Callables, dlatego mogą przechodzić w &zmienne.
user0721090601
1
Dzięki! Podczas gdy jnthn odpowiedział na moje pytanie bardzo bezpośrednio, zaznaczam to jako odpowiedź, ponieważ podkreśla prawdziwą przyczynę mojego problemu - zły znak. Traktowanie tokena jako wywoływalnego od samego początku jest znacznie czystszym rozwiązaniem.
Paweł Pabian bbkr
11

Umieść &przed zmienną:

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

Parser szuka &, a następnie deleguje do reguły parsowania zmiennej Raku, która z powodzeniem parsuje taki kontekstyzator.

Jonathan Worthington
źródło