【问题标题】:How to pass params to token referenced by variable?如何将参数传递给变量引用的令牌?
【发布时间】:2020-01-08 22:50:18
【问题描述】:

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

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 中的这种情况。

【问题讨论】:

    标签: raku


    【解决方案1】:

    在变量前放置&amp;

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

    解析器查找&amp;,然后委托给 Raku 变量解析规则,该规则将愉快地解析这样的上下文生成器。

    【讨论】:

      【解决方案2】:

      要么:

      • 使用 jnthn 的答案中的解决方案,让 Raku 明确知道您希望使用 $ sigil 的令牌变量作为 Callable

      • 首先将变量显式声明为Callable,并在调用中进行相应的更改:

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

      【讨论】:

      • 可能有助于指出令牌只是设置了某些属性的正则表达式,而正则表达式又是可调用对象,因此它们可以进入&amp; 变量。
      • 谢谢!虽然 jnthn 非常直接地回答了我的问题,但我将这个问题标记为答案,因为它强调了我的问题的真正原因 - 错误的印记。从一开始就将令牌视为 Callable 是更清洁的解决方案。
      猜你喜欢
      • 1970-01-01
      • 2018-11-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-04
      相关资源
      最近更新 更多