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

时间:2017-08-05 09:44:49

标签: perl6

来自syntax doc

  

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

android:theme="@style/ThemeOverlay.Material.Light">

这很好,Why is this Perl 6 feed operator a “bogus statement”?发生了什么。

但是,此规则对于不受约束的if True { say "Hello"; } say "world"; 有何用处?这是一个特例吗?

else

或者with-orwith example

怎么样?
if True {
    say "Hello";
}
else {
    say "Something else";
}
say "world";

1 个答案:

答案 0 :(得分:4)

您找到的文档并不完全正确。 documentation has been updated and is now correctnqp。它现在写着:

  

以裸块结尾的完整语句可以省略尾随分号,如果同一行上没有其他语句跟随块的结束大括号}。

     

...

     

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

原始答案:

查看Rakudohttps://github.com/perl6/nqp/blob/master/src/NQP/Grammar.nqp#L243if的语法,似乎一组if/elsif/else块作为一个控制语句被解析出来。

if

nqp的规则
rule statement_control:sym<if> {
    <sym>\s
    <xblock>
    [ 'elsif'\s <xblock> ]*
    [ 'else'\s <else=.pblock> ]?
}

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

Rakudo中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/)> ]?
}

(2017年8月5日{{3}})