🎄 10/25. Perl 6 中的化简运算符

欢迎来到 Perl 6 One-Liner Advent Calendar 的第10天!今天,将有三个单行命令而不是一个。

我们今天的客人是一个带有方括号的化简结构。当它们不包围数组索引时,它们就工作在完全不同的领域中了。

例 1

最经典的例子,也是 Perl 6 Calendar 2019,使用化简运算符来计算阶乘:

1
say [*] 1..2019

Perl 6 中的 [ ] 是一个化简元运算符。名字里面的的「元」告诉我们它可以用作另一个运算符的包层(顺便说一句,不仅仅是作用于运算符)。

在第一个示例中,该运算符包含另一个运算符,并且可以通过将范围注册到列表并将 * 放在其所有元素之间来重写整行:

1
say 1 * 2 * 3 #`(more elements) * 2018 * 2019

例2

现在,让我们解决欧拉项目的问题5,我们需要找到最小的数字,这个数字可以被从1到20的所有数字整除。

让我在 Perl 6 中给你一个直接的答案:

1
say [lcm] 1..20

此代码看起来与前面的示例非常相似,但使用另一个运算符 lcm 例程,它是 Perl 6 中的中缀运算符。这个名字代表最小公倍数,但在文档中你还可以读到它返回这两个参数都可以被整除的最小整数。几乎相同的词,用于表达我们要解决的问题。

1
say 1 lcm 2 lcm 3 lcm 4 lcm 5 lcm 6 lcm 7 # ... and up to 20

例子3

其他已经内置在 Perl 6 中的中缀运算符也可以非常高效。这是一个只用几个代码字符旋转矩阵的例子:

1
[Z] <A B C>, <D E F>, <H I J>

在这里,我们正在转换具有从A到J九个元素的二维矩阵。在输出中,行成为列,列成为行:

1
((A D H) (B E I) (C F J))

zip 中缀运算符 Z 已插入列表的元素之间,因此上述代码类似于以下代码:

1
<A B C> Z <D E F> Z <H I J>

请注意,如果你想强调操作的顺序,你可能不会完全得到您想要的内容:

1
2
> (<A B C> Z <D E F>) Z <H I J>
(((A D) H) ((B E) I) ((C F) J))

好吧,在我们没有和 Lisp 走得太近之前,我们就此打住。明天见!