隐式惰性 gather/take 不被视为 "lazy" 对象

Implicitly lazy gather/take not considered a "lazy" object

documentation for gather/take mentions

Binding to a scalar or sigilless container will also force laziness.

然而,

my \result = gather { for 1..3 { take $_² } };
say result.is-lazy # OUTPUT: «False␤»  

如果您使用标量并使用 := 进行绑定,也会发生同样的情况。有什么方法可以创建隐式惰性 gather/take 语句吗?

Update:其实是懒惰的,只是没有按照预期的方式响应is-lazy方法:

my $result := gather { for 1..3 { say "Hey"; take $_² } };
say $result[0] # OUTPUT: «Hey␤1␤»

所以问题是"What are the conditions for is-lazy to consider things actually lazy?"

我认为问题确实在于您实际上无法分辨 gather 块中发生的事情。所以这就是 Seq 对象告诉你它不是懒惰的原因。

也许更多的是文档问题:如果 is-lazy returns True,那么您可以确定 Seq(好吧,实际上它的基础 Iterator)不会自行结束。如果is-lazyreturnsFalse,基本就是我们不能确定

有人可能会争辩说,在那种情况下 is-lazy 应该 return Bool 类型对象,这也将被解释为假(因为所有类型对象都被认为是 False 在布尔上下文中)。但这至少会给出一些迹象表明它确实是不确定的/不可判定的。