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.

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」

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.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.