Bagaimana cara mengirimkan parameter token yang dirujuk oleh variabel?

10

Saya dapat dengan mudah menggunakan tanda tangan token dengan menggunakan nama token secara langsung:

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

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

Namun saya belum menemukan cara untuk melakukan ini, ketika token disimpan dalam variabel:

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

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

Keduanya memberi:

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

Apa sintaks ajaib untuk melakukan itu?

BTW: Saya bahkan melihat-lihat paket uji Raku dan tidak termasuk kasus seperti itu di roast/S05-grammar/signatures.t.

Pawel Pabian bbkr
sumber

Jawaban:

8

Antara:

  • Gunakan solusi dalam jawaban jnthn untuk membuat Raku secara eksplisit tahu Anda ingin menggunakan $variabel token sigil'd Anda sebagai a Callable.

  • Deklarasikan variabel sebagai eksplisit Callabledi tempat pertama dan buat perubahan terkait dalam panggilan:

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

say 'axb' ~~ / 'a' <&t: 'x'> 'b' /;   # 「axb」
say 'axb' ~~ / 'a' <&t( 'x' )> 'b' /; # 「axb」
raiph
sumber
2
Mungkin berguna untuk menunjukkan bahwa token hanya regexen dengan set atribut tertentu, dan regexen, pada gilirannya, Callable, maka mereka dapat masuk ke &variabel.
user0721090601
1
Terima kasih! Sementara jnthn menjawab pertanyaan saya secara langsung, saya menandai pertanyaan ini sebagai jawaban, karena itu menekankan penyebab sebenarnya masalah saya - sigil yang salah. Memperlakukan token sebagai Callable dari awal adalah solusi yang jauh lebih bersih.
Pawel Pabian bbkr
11

Tempatkan &sebelum variabel:

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

Pengurai mencari &, dan kemudian mendelegasikan ke aturan parse variabel Raku, yang dengan senang hati akan menguraikan kontekstualisasi seperti ini.

Jonathan Worthington
sumber