这就是我正在努力做的事情。
> my sub nplus1($n) {$n +1}
> my regex nnplus1 { ^ (\d+) &nplus1($0) $ }
> "123" ~~ &nnplus1
P6opaque: no such attribute '$!pos' in type Match...
请记住,正则表达式是子表达式。所以不要称你的匹配者为sub
——更具体一点,称之为regex
。是的,您可以将参数传递给regex
/token
/rule
。当您匹配在解析时改变其状态的语言时,执行此操作非常重要。例如,在 YAML 中,您可以解析“data[0]: 17”。之后,下一行可以以“data[1]”开头,但不能以“data[2]”开头。因此将额外信息作为参数传递是有用的。
另请注意,当您将其转换为正则表达式时,有些事情会发生变化。$n+1
将具有新的含义(这是错误的)。但是,简单变量仍然会被插值,因此如果您在正则表达式主体中将其声明为新变量:my $npp = ...
。但即便如此,你也会发现它仍然不起作用。当您添加类似的辅助语句时{say "n is $n"}
,您会发现您没有传递有效的参数。这是因为在没有大括号的类似代码的上下文中(当您使用表达式作为另一个匹配器的参数时),rakudo 不会更新匹配变量。添加大括号时,将重新计算或重新缓存当前匹配变量。这个 hack 看起来像是一个拼写错误,所以我建议您添加一条注释来解释空大括号。最终代码是这样的:
my regex nplus1($n) {
:my $npp=$n+1;
$npp
}
my regex nnplus1 { (\d+) {} <nplus1($0)> }
say "123124" ~~ &nnplus1;
在这种情况下(基本上是递归),我喜欢通过更改参数中的数据而不是更改函数体中的数据来使事情变得更整洁:<nplus1($0+1)>
而不是定义:my $npp = $n+1;
.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)