为什么我不能在Perl 6列表中"尾随"`tail`的结果?

bri*_*foy 8 perl6 seq

为什么我不能tail结果tail呢?我可以调用head序列tail返回(和其他变体),但是a tail上的a tail不起作用(在2017.10中):

> my $list = <a b c d e f g h i j>;
(a b c d e f g h i j)
> $list.head(5).head
a
> $list.head(5).tail
e
> $list.tail(5).head
f
Run Code Online (Sandbox Code Playgroud)

这个失败了:

> $list.tail(5).tail
Nil
Run Code Online (Sandbox Code Playgroud)

但扔list在那里工作:

> $list.tail(5).list.tail
j
Run Code Online (Sandbox Code Playgroud)

小智 8

这是一个错误.

该.count-only优化方法List.iterator没有考虑到一个事实,即迭代器可能已经被部分消耗(在这里,由第一.tail调用)时,调用该方法,正如timotimo ++在评论中指出,保持总是返回原来的长度.该argless .tail然后使用该方法,击中了错误.

现在已经在2017.11-76-gf70e20bRakudo上修复了

除非我误解了迭代器协议,否则在很多其他迭代器中都会出现同样的错误,所以感谢找到这个配置单元!

  • 进一步修复了0e228fab8a0b6e91f001和854c10c27e49041c87841 (3认同)