为什么这个Perl 6 Feed操作员是"虚假声明"?

bri*_*foy 7 whitespace perl6 feed-operator

我把这个例子从10日- Perl 6的2010出现日历的饲料经营者与细微变化.uc.ucfirst是不再有:

my @rakudo-people = <scott patrick carl moritz jonathan jerry stephen>;
@rakudo-people
    ==> grep { /at/ } ==> map { .uc } ==> my @who-it's-at;
say ~@who-it's-at;
Run Code Online (Sandbox Code Playgroud)

我用一些额外的空格稍微改写一下:

my @rakudo-people = <scott patrick carl moritz jonathan jerry stephen>;
@rakudo-people
    ==> grep { /at/ }
    ==> map { .uc } ==> my @who-it's-at;
say ~@who-it's-at;
Run Code Online (Sandbox Code Playgroud)

现在这是一个"虚假陈述":

===SORRY!=== Error while compiling ...
Bogus statement
------>         ==> grep { /at/ }?<EOL>
expecting any of:
    postfix
    prefix
    statement end
    term
Run Code Online (Sandbox Code Playgroud)

这个例子不是问题.当前文档中的一些示例可以表现出相同的行为.

如果我在违规行的末尾添加一个空格,它会再次起作用:

my @rakudo-people = <scott patrick carl moritz jonathan jerry stephen>;
@rakudo-people
    ==> grep { /at/ } \
    ==> map { .uc } ==> my @who-it's-at;
say ~@who-it's-at;
Run Code Online (Sandbox Code Playgroud)

奇怪的是,该行末尾的评论不起作用.我本以为它会吃掉那些令人讨厌的空白.

饲料经营者说:

对于采用单个参数或第一个参数是块的例程/方法,通常需要使用括号调用

这样可行:

my @rakudo-people = <scott patrick carl moritz jonathan jerry stephen>;
@rakudo-people
    ==> grep( { /at/ } )
    ==> map { .uc } ==> my @who-it's-at;
say ~@who-it's-at;
Run Code Online (Sandbox Code Playgroud)

但为什么不是第一种形式的问题呢?在这里做什么空白?什么情况包含在"经常需要"中?

sml*_*mls 9

从关于分离语句的Perl 6文档:

后面的大括号后面跟一个换行符表示一个语句分隔符

换句话说,每当一个块右括号是行中的最后一个(不计算空格和注释)时,解析器就会隐式地在它后面插入一个分号.

这允许我们在没有分号后写下面的内容}:

my @foo = @bar.map: {
    ...
}
Run Code Online (Sandbox Code Playgroud)

分号在那里会很难看,如果你先写了循环for @bar { ... },然后决定将它变成一个map像这样的赋值,那么添加尾随分号会很烦人而且容易忘记.因此,在大多数情况下,在行尾块之后的这种自动语句终止是有帮助的.

但是,饲料操作员进入区块是一种情况(可能是唯一的一种),它会让人们绊倒.

为防止它发生,请在块之后插入\(也称为空格),如您已经注意到的那样.unspace使包含换行符的空白对解析器不可见,因此不会应用上述基于换行的解析器规则.