如何将参数传递给变量引用的令牌?


10

我可以通过直接使用令牌名称来轻松使用令牌签名:

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

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

但是,当令牌存储在变量中时,我还没有找到一种方法来执行此操作:

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

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

两者都给:

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

这样做的神奇语法是什么?

顺便说一句:我什至浏览了Raku测试套件,并且在中没有包含这种情况roast/S05-grammar/signatures.t

Answers:


8

要么:

  • 使用jnthn答案中的解决方案,让Raku明确知道您希望将$标记的标记变量用作Callable

  • 首先声明该变量为显式Callable位置,然后在调用中进行相应的更改:

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

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

2
可能会指出令牌只是带有特定属性集的regexen,而regexen又是Callables,因此它们可以放入&变量中。
user0721090601

1
谢谢!当jnthn回答了我的问题时,我将其标记为答案,因为它强调了我问题的真正原因-错误的信号。从一开始就将令牌视为Callable是更干净的解决方案。
Pawel Pabian bbkr

11

&在变量前放置一个:

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

解析器将查找&,然后将其委托给Raku变量解析规则,该规则将很高兴地解析此类上下文化器。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.