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

Questions on the prime number calculating code in Raku

我在 RosettaCode

看到了这段代码
constant @primes = 2, 3, { first * %% none(@_), (@_[* - 1], * + 2 ... Inf) } ... Inf;
say @primes[^10];

在显式生成器块内:

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

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

3- @_[* - 1]中的*和下一个*指的是什么?

4- 序列 (@_[* - 1], * + 2 ... Inf) 如何达到寻找素数的目的?

谢谢。

外层序列运算符可以理解为:从2和3开始序列,然后运行block中的代码计算出后面的每一个值,一直往下直到无穷大。

序列运算符将向该块传递所需数量的参数。例如,斐波那契数列表示为 1, 1, * + * ... Inf,其中 * + * 对于 lambda -> $a, $b { $a + $b } 是 shorthand;因为这希望有两个参数,所以它将被赋予序列中的前两个值。

当我们在一个块中使用@_时,就好像我们写了一个像-> *@_ { }这样的lambda,这是一个slurpy。当与 ... 一起使用时,这意味着我们希望传递 所有 序列中的先前值。

sub first 接受一个谓词(我们评估 returns true 或 false 的东西)和要搜索的值列表,以及 returns 匹配谓词的第一个值。 (阅读这样的东西的提示:每当我们进行像 function-name arg1, arg2 这样的调用时,我们总是在解析参数的术语,这意味着我们知道 * 在这里不能是乘法运算符。)

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

接下来的 @_[* - 1], * + 2 ... Inf 是要搜索的值序列,直到我们找到下一个素数。这采用以下形式:第一个值,如何获得下一个值,并继续直到无穷大。

第一个值是我们找到的最后一个素数。再一次,* - 1 是一个接受参数并从中减去 1 的闭包。当我们将代码传递给数组索引器时,它会根据元素的数量进行调用。因此 @arr[* - 1] 是 "the last thing in the array" 的 Raku 成语,@arr[* - 2] 将是 "the second to last thing in the array",等等

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

所以,直觉上,这一切都意味着:下一个素数是 none 个先前素数所划分的第一个(奇数)值。