Perl 6的其他问题是否也是声明分离的特殊情况?

bri*_*foy 8 perl6

语法doc:

后面的大括号后面跟一个换行符表示一个语句分隔符,这就是为什么你不需要在if语句块之后写一个分号.

if True {
    say "Hello";
}
say "world";
Run Code Online (Sandbox Code Playgroud)

这很好,发生了什么为什么这个Perl 6饲料操作员是一个"虚假陈述"?.

但是,这个规则对于一个不受约束的人else如何运作?这是一个特例吗?

if True {
    say "Hello";
}
else {
    say "Something else";
}
say "world";
Run Code Online (Sandbox Code Playgroud)

或者,with-orwith示例如何:

my $s = "abc";
with   $s.index("a") { say "Found a at $_" }
orwith $s.index("b") { say "Found b at $_" }
orwith $s.index("c") { say "Found c at $_" }
else                 { say "Didn't find a, b or c" }
Run Code Online (Sandbox Code Playgroud)

Chr*_*oms 4

您找到的文档并不完全正确。该文档已更新并且现在是正确的。现在内容如下:

如果同一行上没有其他语句跟在块的右花括号 } 后面,则以裸块结尾的完整语句可以省略尾随分号。

...

对于属于同一 if/elsif/else(或类似)构造的一系列块,隐含分隔符规则仅适用于该系列的最后一个块的末尾。


原答案:

查看ifinnqpRakudo的语法,似乎一if/elsif/else组块被一起解析为一个控制语句。

规则ifnqp

rule statement_control:sym<if> {
    <sym>\s
    <xblock>
    [ 'elsif'\s <xblock> ]*
    [ 'else'\s <else=.pblock> ]?
}
Run Code Online (Sandbox Code Playgroud)

https://github.com/perl6/nqp/blob/master/src/NQP/Grammar.nqp#L243,截至 2017 年 8 月 5 日)

if乐道中的规则

rule statement_control:sym<if> {
    $<sym>=[if|with]<.kok> {}
    <xblock(so ~$<sym>[0] ~~ /with/)>
    [
        [
        | 'else'\h*'if' <.typed_panic: 'X::Syntax::Malformed::Elsif'>
        | 'elif' { $/.typed_panic('X::Syntax::Malformed::Elsif', what => "elif") }
        | $<sym>='elsif' <xblock>
        | $<sym>='orwith' <xblock(1)>
        ]
    ]*
    {}
    [ 'else' <else=.pblock(so ~$<sym>[-1] ~~ /with/)> ]?
}
Run Code Online (Sandbox Code Playgroud)

https://github.com/rakudo/rakudo/blob/nom/src/Perl6/Grammar.nqp#L1450截至 2017 年 8 月 5 日)

  • 现在我可以更清楚地思考它:实际上这不是一个特殊情况,因为关于哪里不需要 `;` 的规则是关于语句结束的规则,但 if/elsif/else 序列实际上是一个单一声明。 (2认同)