为什么这个Perl 6 Feed运算符是一个"伪造的声明"?

时间:2017-07-23 20:12:24

标签: whitespace perl6 feed-operator

我从Day 10 – Feed operators of the Perl 6 2010 Advent Calendar开始使用此示例,而.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;

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

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;

现在它是一个虚假陈述&#34;:

===SORRY!=== Error while compiling ...
Bogus statement
------>         ==> grep { /at/ }⏏<EOL>
expecting any of:
    postfix
    prefix
    statement end
    term

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

如果我在违规行的末尾添加unspace,则会再次有效:

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;

奇怪的是,该行末尾的注释不起作用。我原以为它会吃掉那些令人讨厌的空白。

feed operator说:

  

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

有效:

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;

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

1 个答案:

答案 0 :(得分:9)

来自Separating Statements上的Perl 6文档:

  

结束花括号后跟换行符表示语句分隔符

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

这允许我们在<nav> <a href="#home"> <h1>Brillian.</h1> </a> <ul> <li> <a href="#home">Home</a> </li> <li> <a href="javascript:void">Portfolio</a> </li> <li> <a href="blog.html">Blog</a> </li> <li> <a href="#about">About</a> </li> <li> <a href="contact.html">Contact</a> </li> <li> <a href=""><i class="fa fa-search" aria-hidden="true"></i></a> </li> </ul> </nav>之后编写如下内容而不使用分号:

}

分号在那里会很难看,如果你先把循环写成my @foo = @bar.map: { ... } ,然后决定把它变成for @bar { ... }这样的赋值,那么添加尾随分号会很烦人,容易忘记。因此,在大多数情况下,这种自动语句在行尾结束后终止是有帮助的。

然而,喂食操作员的饲料操作员是一种情况(可能是唯一的一种),它会使人们绊倒。

为了防止它发生,请在阻止后插入map(a.k.a。unspace),如您所知。 unspace使包含换行符的空白对解析器不可见,因此上述基于换行的解析器规则不会被应用。