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

时间:2019-02-15 09:32:24

标签: perl6

此代码:

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

打印

Hey
1
Control flow commands not allowed in toplevel

如果取消“ Hey” .say,则消除最后一条错误消息;这可能意味着错误实际上是在说在标签后面不允许 non 控制流命令。但是the documentation(其中needs to be improved将循环作为“示例”,而the grammar则表明循环应该在语句的前面。所以问题是:它可以用于if语句,还是循环?

1 个答案:

答案 0 :(得分:8)

如果此代码在另一个作用域内,则错误是不同的:

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

这也是LTA,因为它没有提及标签名称。

但是简而言之:Perl 6当前没有goto。当前,标签仅用作指定您要nextredolast退出哪个循环构造的方式。通过在标签和循环结构之间放置一条语句,您可以有效地将其用作goto,但尚未实现。

但是对于我来说,确实存在关于这两个错误的LTA程度的罚单。

另外,使用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问题:添加为this