有关Raku中素数计算代码的问题

Lar*_*een 6 primes sequence raku

我在RosettaCode上遇到了这段代码

constant @primes = 2, 3, { first * %% none(@_), (@_[* - 1], * + 2 ... Inf) } ... Inf;
say @primes[^10];
Run Code Online (Sandbox Code Playgroud)

在显式生成器块内:

1- @_s指的是什么序列?

2-第一个*指的是什么?

3- *in @_[* - 1]和next *指的是什么?

4-序列如何(@_[* - 1], * + 2 ... Inf)用于查找素数?

谢谢。

Jon*_*ton 9

外部序列运算符可以理解为:从2和3开始序列,然后运行块中的代码得出以下每个值,并一直进行到无穷大。

序列运算符将根据需要传递尽可能多的参数。例如,斐波那契数列表示为1, 1, * + * ... Inf,其中* + *lambda的简写形式-> $a, $b { $a + $b };由于这需要两个参数,因此将在序列中给出前两个值。

当我们@_在一个块中使用时,就好像我们编写了一个lambda一样-> *@_ { },这是一种脚。与结合使用时...,表示我们希望传递序列中的所有先前值。

该子项first包含一个谓词(我们评估为返回true或false的事物)和要搜索的值列表,并返回与该谓词匹配的第一个值。(有关读取此类内容的提示:每当我们进行这样的调用时,我们function-name arg1, arg2总是在解析参数的项,这意味着我们知道*此处不能为乘法运算符。)

我们给出的谓词first* %% none(@_)。这是一个闭包,它接受一个参数,并检查该序列是否可被该序列中的先前值整除-因为如果是,则它不能是质数!

接下来的@_[* - 1], * + 2 ... Inf是要搜索的值序列,直到找到下一个质数为止。它采用以下形式:第一个值,如何获取下一个值,并一直持续到无穷大。

第一个值是我们找到的最后一个素数。再一次* - 1是一个接受参数并从中减去1的闭包。当我们将代码传递给数组索引器时,将使用元素数量来调用它。因此@arr[* - 1],Raku惯用语是“数组中的倒数@arr[* - 2]第二个”,将是“数组中倒数第二个”,等等。

* + 2计算将计算序列中的下一个值,它是一个接受参数并将其加2的闭包。尽管我们实际上可以做一个简单的范围@_[* - 1] .. Inf并获得正确的结果,但是检查所有偶数是浪费的,因此在* + 2那里产生一个奇数序列。

因此,直观地讲,这都意味着:下一个质数是先前质数均未划分的第一个(奇数)值。