语法操作代码的替换引发奇怪的“P6opaque”错误

Ste*_*ieD 5 grammar raku

我有一个覆盖另一个操作类中的操作的操作:

        method taskwiki-prefix($/ is copy) {
            my $prefix = $/.Str;
            $prefix ~~ s:g!'|'!!;
            make $prefix;
        }
Run Code Online (Sandbox Code Playgroud)

替换会引发此错误:

P6opaque: no such attribute '$!made' on type Match in a List when trying to bind a value

如果我注释掉替换,错误就会消失。dd $prefix显示:

Str $prefix = " Tasks ||"

所以它只是一个普通的字符串。

如果我删除:g副词,就不会再出现错误,但是这样做会产生生成值Nil,并且 的输出中不会显示任何内容$<taskwiki-prefix>.made

在我看来,如果我猜的话,比赛中的换人和动作之间存在一些不良的互动。

有什么解决办法吗?

Jon*_*ton 5

这是您上一个问题的另一种情况,Raku 语法操作抛出“无法在 Nil 类型对象中绑定属性。您是否忘记了 '.new'?” 使用“make”时出错。在那里,该make函数想要更新$/当前的范围。

替换更新$/,并且:

  • 在副词的情况下:g,aList以 , 结尾$/,并且make变得混乱。我提出了一个改进的错误
  • 在 no 的情况下:g,有一个Matchin$/并附加到它 - 但是,它不再是Match传递到方法中的对象

我建议:

  1. 始终让您的操作方法的签名为($/),这样就不会混淆 的目标make
  2. 如果可能,请避免重新解析(这是您自己的答案中提到的已实现的解决方案)。
  3. 如果您无法避免在操作方法中进行其他匹配或替换,请将它们放在 asub或 private中method,然后调用它。


Ste*_*ieD 2

通过更改语法以提供更清晰的输出来解决问题,这样我就不必操作变量$/