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

jjm*_*elo 6 perl6

这段代码:

FOO:
"Hey".say;
for <1 2> { 
    say "1";
    last FOO
}
Run Code Online (Sandbox Code Playgroud)

打印

Hey
1
Control flow commands not allowed in toplevel
Run Code Online (Sandbox Code Playgroud)

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

Eli*_*sen 8

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

{
    FOO:
    "Hey".say;
    for <a b> {
        .say;
        last FOO
    }
}
# Hey
# a
# labeled last without loop construct
Run Code Online (Sandbox Code Playgroud)

这也是LTA,因为它没有提到标签的名称.

但简而言之:Perl 6目前没有goto.目前,标签只能用作一种方式来指定要哪个循环结构next,redolast出去的.通过在标签和循环结构之间放置一个语句,您实际上将它用作a goto,它仍然没有实现.

但事实上,对于我而言,关于这两个错误的LTA的票据确实存在.

此外,使用FIRST移相器作为替代,似乎有相同的问题:

FOO:
for <a b> { 
    FIRST "Hey".say;
    .say;
    last FOO;
}   
# Hey
# a
# labeled last without loop construct
Run Code Online (Sandbox Code Playgroud)

但没有特定的标签运行良好:

FOO:
for <a b> { 
    FIRST "Hey".say;
    .say;
    last;
}   
# Hey
# a
Run Code Online (Sandbox Code Playgroud)

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