【问题标题】:Why is this Perl 6 feed operator a "bogus statement"?为什么这个 Perl 6 提要运算符是“虚假陈述”?
【发布时间】:2017-12-29 09:12:56
【问题描述】:

我从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;

现在是“虚假陈述”:

===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;

但为什么在第一种形式中这不是一个问题?空白在这里做什么? “经常需要”又包括哪些情况?

【问题讨论】:

    标签: whitespace raku feed-operator


    【解决方案1】:

    来自Separating Statements 上的 Perl 6 文档:

    右大括号后跟换行符表示语句分隔符

    换句话说,只要块的右大括号是一行中的最后一个东西(不包括空格和cmets),那么解析器就会隐式地在它后面插入一个分号。

    这使我们可以在} 后面不带分号编写如下内容:

    my @foo = @bar.map: {
        ...
    }
    

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

    但是,喂入块的饲料操作员是一种(可能是唯一一种)会绊倒人们的情况。

    为防止它发生,请在块后插入 \(又名unspace),正如您已经注意到的那样。 unspace 使包含换行符的空格对解析器不可见,因此上述基于换行符的解析器规则将不适用。

    【讨论】:

    • 呃,我曾经知道结束卷曲。谢谢!
    • 我后来注意到这些文档在这里具有误导性。只有一些右大括号会跟在后面。这取决于 Perl 6 解析器的状态。这不是一个好规则。
    猜你喜欢
    • 2020-08-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多