对序列中的供应做出反应

react on a supply from a sequence

提问人:Fernando Santagata 提问时间:3/10/2019 最后编辑:TholleFernando Santagata 更新时间:3/11/2019 访问量:162

问:

我不明白为什么这个程序有效:

my $supply = Supply.interval: 1;

react {
  whenever $supply       { put "Got $^a"  }
  whenever Promise.in(5) { put 'Timeout!'; done }
}

END put 'Ending…'

打印此:

Got 0
Got 1
Got 2
Got 3
Got 4
Timeout!
Ending…

并正确退出,而这个:

my $supply = (1, 1, * + * … ∞).Supply;

react {
  whenever $supply       { put "Got $^a"; sleep 1 }
  whenever Promise.in(5) { put 'Timeout!'; done }
}

END put 'Ending…'

指纹

Got 1
Got 1
Got 2
Got 3
Got 5
Timeout!

但随后它挂起并且不输出“结局...”;在这种情况下,“完成”还不够吗?

如果我将“done”替换为“exit”,程序可以正常工作并退出。

序列 raku

评论

0赞 jjmerelo 3/11/2019
我必须更彻底地考虑这个问题,但其中一个区别是,在第二种情况下,供应中的东西更多,而在第一种情况下,一旦你宣布完成,你就有效地停止了生产。这可能是 的文档不足的情况,但它可能会朝着这个方向发展。此外,Seq.Supply 还会创建一个列表。docs.perl6.org/routine/Supply#(任何)_method_Supply不知道无限序列将如何发展......done
1赞 Håkon Hægland 3/11/2019
似乎死锁与无限序列有关,因为如果我替换它就可以正常工作。my $supply = (^10).Supply
0赞 Fernando Santagata 3/12/2019
@HåkonH ægland 我认为 Supply.interval 也是一个无限序列,因为它返回一个递增的值,并且它永远持续下去。
0赞 jjmerelo 3/12/2019
@FernandoSantagata它并不是一个真正的无限序列;只要供应不完成,它就会产生新的元素。

答: 暂无答案