切片索引的懒散如何影响数组/列表的切片?[拉库]



当我们对索引超过数组边界的数组进行切片时,我们会得到未定义的(任意(

当我们将相同的切片索引作为惰性列表传递时,我们会得到数组/列表的现有值(除此之外(:

my @a = ^5;
say @a[^10];        # (0 1 2 3 4 (Any) (Any) (Any) (Any) (Any))
say @a[lazy ^10];   # (0 1 2 3 4)

很明显,切片索引的懒散会影响结果。

试图不了解事情的现状,作为概念的证明,我编程了我的切片机制的简单版本:

my @a = ^5;
my @s1 = ^10;
my @s2 = lazy ^10;
sub postcircumfix:<-[ ]-> (@container, @index) {
my $iter = @index.iterator;
gather {
loop {
my $item := $iter.pull-one;
if $item =:= IterationEnd {
last;
}
with @container[$item] {
take @container[$item]
} else {
@index.is-lazy ?? { last } !! take @container[$item];
}
}
}
}
say @a-[@s1]-;   # (0 1 2 3 4 (Any) (Any) (Any) (Any) (Any))
say @a-[@s2]-;   # (0 1 2 3 4)

但我想知道我的天真算法是否描述了在引擎盖下计算事物的方式!

可以在array_slice.pm6中找到如何在后台完成工作的源代码。

具体来说,您可以在L73中看到以下内容:

if is-pos-lazy {
# With lazy indices, we truncate at the first one that fails to exists.
my rest-seq = Seq.new(pos-iter).flatmap: -> Int() $i {
nqp::unless(
$eagerize($i),
last,
$i
)
};
my todo := nqp::create(List::Reifier);
nqp::bindattr(todo, List::Reifier, '$!reified', eager-indices);
nqp::bindattr(todo, List::Reifier, '$!current-iter', rest-seq.iterator);
nqp::bindattr(todo, List::Reifier, '$!reification-target', eager-indices);
nqp::bindattr(pos-list, List, '$!todo', todo);
}
else {
pos-iter.push-all: target;
}

所以,正如你所推测的,它确实会在列表项不存在后停止。这是毫无疑问的,因为许多惰性列表是无限的,迭代器没有提供一种方法来知道它们是否是无限的(生成器可能是不确定的(。

如果你真的想启用这样一个功能,例如,你可以编写自己的切片器来处理元素可能不可用的惰性列表,但你必须注意确保只有当你知道它们是有限的时,才会热切地评估它们:

multi sub postcircumfix:<-[ ]-> (@a, @b) {
lazy gather {
take @a[$_] for @b;
}
}
my @a = ^5;
my @b = lazy gather { 
for ^10 -> $i { 
# So we can track when elements are evaluated
say "Generated @b[$i]"; 
take $i;
} 
};
say "Are we lazy? ", @a-[@b]-;
say "Let's get eager: ", @a-[@b]-.eager;
say "Going beyond indices: ", @a-[@b]-[11]

这是的输出

Are we lazy? (...)
Generated @b[0]
Generated @b[1]
Generated @b[2]
Generated @b[3]
Generated @b[4]
Generated @b[5]
Generated @b[6]
Generated @b[7]
Generated @b[8]
Generated @b[9]
Let's get eager: (0 1 2 3 4 (Any) (Any) (Any) (Any) (Any))
Going beyond indices: Nil

相关内容

  • 没有找到相关文章

最新更新