gpt4 book ai didi

whitespace - 为什么这个 Perl 6 feed 操作符是 "bogus statement"?

转载 作者:行者123 更新时间:2023-12-04 11:19:35 25 4
gpt4 key购买 nike

我从 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说:

In the case of routines/methods that take a single argument or where the first argument is a block, it's often required that you call with parentheses



那个有效:
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;

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

最佳答案

来自 Separating Statements 上的 Perl 6 文档:

A closing curly brace followed by a newline character implies a statement separator



换句话说,每当 块的右大括号 是一行中的最后一个东西(不包括空格和注释),然后解析器在它后面隐式插入一个分号。

这使我们可以在 } 之后不加分号的情况下编写如下内容。 :

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

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

然而,喂食到块中的饲料运算符(operator)是一种(可能是唯一一种)让人们绊倒的情况。

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

关于whitespace - 为什么这个 Perl 6 feed 操作符是 "bogus statement"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45269484/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com