Değişkenler tarafından başvurulan paramleri token'e nasıl aktarabilirim?


10

Doğrudan belirteç adını kullanarak belirteç imzalarını kolayca kullanabilirim:

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

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

Ancak jeton değişkente depolandığında bunu yapmanın bir yolunu bulamadım:

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

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

Her ikisi de:

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

Bunu yapmak için sihirli sözdizimi nedir?

BTW: Raku test paketine bile göz attım ve böyle bir durum içermiyor roast/S05-grammar/signatures.t.

Yanıtlar:


8

Ya:

  • Raku'nun $sigil'd token değişkeninizi bir olarak kullanmak istediğinizi açıkça bildirmek için çözümü jnthn yanıtında kullanın Callable.

  • Değişkeni açıkça Callableilk etapta ilan edin ve çağrıda ilgili değişikliği yapın:

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

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

2
Belirteçlerin sadece belirli özellikler ile regexen olduğunu ve regexen'in Callables olduğunu ve dolayısıyla &değişkenlere gidebileceğini belirtmek için yararlı olabilir .
user0721090601

1
Teşekkürler! Jnthn sorumu çok doğrudan cevaplarken, bunu bir cevap olarak işaretliyorum, çünkü problemimin gerçek nedenini vurgulıyor - yanlış imza. Jetonu Baştan itibaren Çağrılabilir olarak işlemek çok daha temiz bir çözümdür.
Pawel Pabian bbkr

11

Bir koyun &değişkenden önce:

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

Ayrıştırıcı &, Raku değişken ayrıştırma kuralını arar ve bu şekilde bağlamsallaştırıcıyı mutlu bir şekilde ayrıştırır.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.