在 Perl 6 中使用 "list comprehension" 的非正方形列表

List of non-squares using "list comprehension" in Perl 6

如何在 Perl 6 中使用 "list comprehension" 创建一个非正方形列表(即平方根不是整数的整数)?我看到 following code from Rosetta Code 展示了如何打印非正方形列表。

sub nth_term (Int $n) { $n + round sqrt $n }

say nth_term $_ for 1 .. 22;

我对列表理解的理解是,它是一种声明式的方式,类似于set-builder notation,用编程语言来描述列表。

到目前为止我注意到的最接近的事情是使用 for 关键字。但由于这实际上只是一个内联循环,我认为这在技术上不是列表理解,尽管它看起来很相似:

my @y = ($_**2 + 1 for 1 .. 10);

但是,我真正想知道的是,是否有一种 "list comprehension" 方法可以创建任何数学上可描述的列表,例如非正方形。以下是我如何强制创建非正方形列表(最多 30 个):

my @non_squares = grep {sqrt($_) != floor(sqrt($_))}, 1 .. 30;

我怎样才能做到这一点作为列表理解?

实际上,您的 my @y = ($_**2 + 1 for 1 .. 10); 示例是 Perl 6 编写列表解析的方式。您还可以按照 Perl 6 design document S04:

中的建议添加条件测试

for ease of writing list comprehensions, a looping statement modifier is allowed to contain a single conditional statement modifier:
...
@evens = ($_ * 2 if .odd for 0..100);

下面是如何编写非正方形(最多 30 个)的 Perl 6 列表理解:

my @non_squares = ($_ if .sqrt != .sqrt.Int for 1 .. 30);

稍微解释一下:for循环的每次迭代中,将当前1到30范围内的数字赋值给默认变量$_(a.k.a。"it")。默认情况下,没有调用者的方法调用会在 "it" 上调用(即 .sqrt$_.sqrt 相同)。因此,对于 1 到 30 范围内的每个数字,检查其平方根以查看它是否具有非整数平方根。如果为真,则它包含在列表中。