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

时间:2018-05-06 21:42:49

标签: syntax functional-programming perl6

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

> sub mysum { $^a + $^b }
> [[&mysum]] 1,3,5
9

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

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

> [[&{ $^a + $^b }]] 1,3,5
> [[{ $^a + $^b }]] 1,3,5

2 个答案:

答案 0 :(得分:15)

您不得以缩进形式获得任何空格。

> [[&({$^a+$^b})]] 1, 3, 5
9

这样更明显的是它是一个reduce,而不是一个数组声明。

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

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

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

> 3 [&( { $^a + $^b } )] 5
8

这类似于使用[…]Z=

等包围元运算符进行包围的扩展
> @a [Z[[+]=]] 1..5
> @a Z[[+]=] 1..5
> @a Z[+=] 1..5
> @a Z+= 1..5

答案 1 :(得分:7)

不确定为什么不起作用。但总有:

say reduce { $^a + $^b }, 1,3,5 # 9

我猜你知道但这是我今晚得到的所有。 :)

我现在把我的评论移到这里并在我睡觉之前将其扩展了一点。

TTIAR错误意味着它无法将reduce解析为reduce。所以我决定快速采取the Perl 6 grammar

我搜索了“reduce”并迅速推断出它必须与this regex不匹配。

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

更新

布拉德回答你的问题作为我们的指南,我的问题的答案立即显而易见。 first line of the regex proper(在两个变量声明之后)直接对应于Brad透露的“无空格”规则:

<?before '['\S+']'>

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

(当然,如果没有布拉德的回答,我会非常困惑为什么这个非空间规则就在那里。)