[] reduce with Perl 6 中的匿名函数
[] reduce with anonymous function in Perl 6
我们可以将 reduce
与带有两个参数的 sub
一起使用,将其放在双括号中:
> sub mysum { $^a + $^b }
> [[&mysum]] 1,3,5
9
但是如果我们想改用匿名函数怎么办?
以下两种变体都会产生编译错误:
> [[&{ $^a + $^b }]] 1,3,5
> [[{ $^a + $^b }]] 1,3,5
不确定为什么这不起作用。但总有:
say reduce { $^a + $^b }, 1,3,5 # 9
我猜你已经知道了,但这就是我今晚的全部内容。 :)
我现在把我的评论移到这里,并在我睡觉前稍微扩展一下。
TTIAR 错误意味着它无法将 reduce 解析为 reduce。所以我决定快速浏览一下 the Perl 6 grammar。
我搜索了“reduce”并很快推断出它一定无法匹配 this regex。
虽然该正则表达式可能只有 20 行左右的长度,而且我认识大多数结构,但它显然不是微不足道的。我想象有一种方法可以使用 Grammar::Debugger
and/or 一些其他语法调试工具和 Perl 6 语法,但我不知道。同时,您现在一定是正则表达式高手了,所以您告诉我:它为什么不匹配? :)
更新
以 Brad 对您问题的回答为指导,我的问题的答案显而易见。 first line of the regex proper(在两个变量声明之后)直接对应于Brad透露的“no spaces”规则:
<?before '['\S+']'>
这是一个断言,正则表达式引擎位于 [...]
形式的字符串之前,其中 ...
是一个或多个非 space 字符。 (\s
表示space,\S
表示非space。)
(当然,如果没有 Brad 的回答,我会非常困惑 为什么 这条非 space 规则就在那里。)
你不能在那种形式的 reduce 中有任何空格。
> [[&({$^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
我们可以将 reduce
与带有两个参数的 sub
一起使用,将其放在双括号中:
> sub mysum { $^a + $^b }
> [[&mysum]] 1,3,5
9
但是如果我们想改用匿名函数怎么办?
以下两种变体都会产生编译错误:
> [[&{ $^a + $^b }]] 1,3,5
> [[{ $^a + $^b }]] 1,3,5
不确定为什么这不起作用。但总有:
say reduce { $^a + $^b }, 1,3,5 # 9
我猜你已经知道了,但这就是我今晚的全部内容。 :)
我现在把我的评论移到这里,并在我睡觉前稍微扩展一下。
TTIAR 错误意味着它无法将 reduce 解析为 reduce。所以我决定快速浏览一下 the Perl 6 grammar。
我搜索了“reduce”并很快推断出它一定无法匹配 this regex。
虽然该正则表达式可能只有 20 行左右的长度,而且我认识大多数结构,但它显然不是微不足道的。我想象有一种方法可以使用 Grammar::Debugger
and/or 一些其他语法调试工具和 Perl 6 语法,但我不知道。同时,您现在一定是正则表达式高手了,所以您告诉我:它为什么不匹配? :)
更新
以 Brad 对您问题的回答为指导,我的问题的答案显而易见。 first line of the regex proper(在两个变量声明之后)直接对应于Brad透露的“no spaces”规则:
<?before '['\S+']'>
这是一个断言,正则表达式引擎位于 [...]
形式的字符串之前,其中 ...
是一个或多个非 space 字符。 (\s
表示space,\S
表示非space。)
(当然,如果没有 Brad 的回答,我会非常困惑 为什么 这条非 space 规则就在那里。)
你不能在那种形式的 reduce 中有任何空格。
> [[&({$^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