[]在Perl 6中使用匿名函数减少

Eug*_*sky 15 syntax functional-programming perl6

我们可以使用reduce带有sub两个参数,将它放在双括号中:

> sub mysum { $^a + $^b }
> [[&mysum]] 1,3,5
9
Run Code Online (Sandbox Code Playgroud)

但是如果我们想要使用匿名函数呢?

以下两个变体都会产生编译错误:

> [[&{ $^a + $^b }]] 1,3,5
> [[{ $^a + $^b }]] 1,3,5
Run Code Online (Sandbox Code Playgroud)

Bra*_*ert 15

您不能以reduce的形式拥有任何空格.

> [[&({$^a+$^b})]] 1, 3, 5
9
Run Code Online (Sandbox Code Playgroud)

这样很明显它是一个reduce,而不是一个数组声明.

> [ { $^a + $^b }, { $^a * $^b } ].pick.(3,5)
8 | 15
Run Code Online (Sandbox Code Playgroud)

double [[…]]只是允许任何函数用作中缀运算符的扩展.

请注意&(…),在不讨论命名函数&foo或已存在的中缀运算符时,必须在此功能中使用.

> 3 [&( { $^a + $^b } )] 5
8
Run Code Online (Sandbox Code Playgroud)

[…]类似于使用包围元运算符的扩展,例如Z=

> @a [Z[[+]=]] 1..5
> @a Z[[+]=] 1..5
> @a Z[+=] 1..5
> @a Z+= 1..5
Run Code Online (Sandbox Code Playgroud)


rai*_*iph 7

不知道为什么不起作用.但总有:

say reduce { $^a + $^b }, 1,3,5 # 9
Run Code Online (Sandbox Code Playgroud)

我猜你知道,但这就是我今晚所得到的一切.:)

我现在在这里移动我的评论并在我睡觉之前将其扩展一点.

TTIAR错误意味着它无法将reduce解析为reduce.所以我决定快速学习Perl 6语法.

我搜索了"reduce"并迅速推断出它必须与此正则表达式不匹配.

虽然那个正则表达式可能只有20行左右,而且我认识到大多数结构,但这显然不是微不足道的.我想有一种方法可以使用Grammar::Debugger和/或其他语法调试工具与Perl 6语法,但我不知道.与此同时,你现在必须是一个正则表达式,所以你告诉我:为什么它不匹配?:)

更新

布拉德回答你的问题作为我们的指南,我的问题的答案立即显而易见.正则表达式第一行(在两个变量声明之后)直接对应于Brad显示的"无空格"规则:

<?before '['\S+']'>
Run Code Online (Sandbox Code Playgroud)

这是一个正则表达式引擎是一个字符串,是形式的前即刻定位断言[...]其中...一个或多个非空格字符.(\s指空间,\S指非空间.)

(当然,如果没有布拉德的答案,我会完全不知道为什么这个非空间规则存在.)