是否可以将Feed与延迟列表一起使用?

Kai*_*epi 8 lazy-evaluation perl6 raku

这有效:

bastille% perl6 -e 'my @squares = (1...*).map({ $_ ** 2 }); say @squares[0..^10].join: ", "'
1, 4, 9, 16, 25, 36, 49, 64, 81, 100
Run Code Online (Sandbox Code Playgroud)

但是,这不是:

bastille% perl6 -e 'my @squares <== map { $_ ** 2 } <== 1...*; say @squares[0..^10].join: ", "'
Cannot push a lazy list onto a Array
  in block <unit> at -e line 1
Run Code Online (Sandbox Code Playgroud)

为什么会抛出?有没有一种方法可以将延迟列表与摘要一起使用?

wam*_*mba 9

feed运算符<==将元素追加到数组。

my @s <== ^3; 
@s <== <a>..<c>; 
say @s
Run Code Online (Sandbox Code Playgroud)
[0 1 2 a b c]
Run Code Online (Sandbox Code Playgroud)

所以

[0 1 2 a b c]
Run Code Online (Sandbox Code Playgroud)

与...类似

my @squares <== map { $_ ** 2 } <== 1...*;
Run Code Online (Sandbox Code Playgroud)

您可以将项目分配运算符 =与方括号一起使用

my @squares.append: map  * ** 2, 1..*;
Run Code Online (Sandbox Code Playgroud)

或下一个小技巧

my @squares = ( map { $_ ** 2 } <== 1..* );
Run Code Online (Sandbox Code Playgroud)

  • 我的@squares =(...);`解决方案似乎是一个不错的,干净的,易于解释的惯用解决方案。另一个看起来很疯狂... :) (4认同)
  • FWIW,我不认为Feed运营商的这种行为实际上是正确的。参见https://github.com/rakudo/rakudo/issues/2899 (4认同)