关于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 个先前素数所划分的第一个(奇数)值。
我在 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 个先前素数所划分的第一个(奇数)值。