无法将地图放入接收器上下文中

Impossible to put a map in sink context

我正在尝试查看在接收器上下文中抛出地图的方式。在这段代码中

class Sunk {
    has $.titanic;
    method sink {
        say "Sinking $!titanic";
    }
}

Sunk.new( :titanic($_) ) for 1..3;

(1..3).map: { Sunk.new( :titanic($_) ) };

for 循环有效地吸收了所有创建的,map 没有。知道为什么吗?

这个烤肉测试:https://github.com/perl6/roast/blob/b9bfe1844db25f65a4aeb351a0107f83689cb5c2/S04-statements/sink.t#L27-L32 应该可以作为测试。地图在接收器上下文中有效,但我不明白它是如何 "run as sunk"。就是 运行.

在您的示例中,map returns 一个 Seq 中包含 Sunk 个对象。整个 Seq 被下沉,这有效地调用了 Seq.iterator.sink-all 而不是 下沉了它的所有元素:它只是通过调用将 Seq 拉空pull-one 直到返回 IterationEnd

我就不多解释了,大部分留到最后。

I'm trying to see the way of throwing a map in sink context.

添加 --> Nil 作为方块的 return 值:

(1..3).map: -> $_ --> Nil { Sunk.new( :titanic($_) ) }

The for loop effectively sinks all the created, the map does not.

默认情况下,块 运行 具有:

  • 接收器上下文中除最后一个语句之外的所有语句。

  • 接收器上下文中的最后一条语句不是。 (最后一条语句是方块的 return 值,因此推测不适合将其扔进水槽。)

您的代码没有为您的 map 调用更改此默认值,因此该块的最后一条语句——它唯一的语句——不在接收器上下文中。 (将 --> Nil 添加到块的签名会将最后一条语句放回接收器上下文中。)

此默认方案的例外情况涉及某种语句关键字。 for 是其中之一——它将其语句或其块中的最后一个语句放在接收器上下文中。 (要撤消它,以便最后一个语句在接收器上下文中是 而不是 ,您可以编写类似 $ = do for ... 的内容。)

This test in roast is supposed to work as a test for that. And map is effectively in a sink context, but I don't see how it's "run as sunk". It's simply run.

我对 the corresponding ticket 和测试感到困惑。所以,抱歉,我帮不上忙。


为了准备这个答案,我进行了数小时的研究。下面是我发现并依赖的一些作品,以及我的简短笔记。

以下许多链接指向 IRC 日志的特定行。我对其中大部分内容的意图是让您阅读每一行之后的对话,以最大限度地从中获得收益(即使它是混乱的,因为我认为即使那样也可能有帮助,正如我接下来解释的那样)。

请考虑至少阅读下面的摘要,并单击一些链接,然后 post 在此答案下发表评论,以在此处引发进一步的讨论,看看我们是否可以朝着清晰的方向前进。