提问者:小点点

标签和“顶层不允许控制流命令”(可能的LTA错误消息)


此代码:

FOO:
"Hey".say;
for <1 2> { 
    say "1";
    last FOO
}

指纹

Hey
1
Control flow commands not allowed in toplevel

如果"Hey". say被删除,最后一条错误消息就会被消除;这可能意味着错误实际上是在标签后面不允许使用非控制流命令。但是留档(需要改进)引用循环作为“示例”,语法表明它应该在语句前面。所以问题是:它可以用于if语句,还是只是循环?


共1个答案

匿名用户

如果您在另一个范围内包含此代码,则错误会有所不同:

{
    FOO:
    "Hey".say;
    for <a b> {
        .say;
        last FOO
    }
}
# Hey
# a
# labeled last without loop construct

这也是长期协议,因为它没有提到标签的名称。

简而言之:Perl 6目前没有goto。目前,标签只能用作指定您希望下一个重做最后一个的循环构造的一种方式。通过在标签和循环构造之间放置语句,您可以有效地将其用作goto,这仍然尚未实现。

但事实上,对我来说,一张关于这两个错误的长期罚单似乎已经到位。

此外,使用FIRST相位器作为替代方案,似乎也有同样的问题:

FOO:
for <a b> { 
    FIRST "Hey".say;
    .say;
    last FOO;
}   
# Hey
# a
# labeled last without loop construct

但在没有特定标签的情况下运行良好:

FOO:
for <a b> { 
    FIRST "Hey".say;
    .say;
    last;
}   
# Hey
# a

后一个问题绝对值得一个rakudo问题:添加为https://github.com/rakudo/rakudo/issues/2699。