无法将地图放入接收器上下文中
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 在此答案下发表评论,以在此处引发进一步的讨论,看看我们是否可以朝着清晰的方向前进。
Larry begins implementing sink handling in STD (2010)。包括主要是为了确定他开始将 raku 的接收器概念放入代码形式(在 STD 解析器中)的点。
Patrick asks for clarity regarding example sub foo() { for @list { .say } }; foo(); 1
(2010)。请关注 Patrick 和 Larry (TimToady) 之间关于 Larry 想要什么的对话,忽略旁白。
TimToady: "sink context is very important for figuring out awesome error messages" (2012)。 (我认为 raku 的接收器功能是一个极度折磨实现者的问题;请参阅下面的问题跟踪器链接。)
jnthn: "Note that eager context and sink context are different. Sink context should make a for loop (or map) not build a result list" (2012) 这是另一个要下沉上下文的部分。这不仅仅是关于很棒的错误消息;这也与性能有关。
9 open issues in rakudo/rakudo matching a search for "last statement"
Several open issues in rakudo/rakudo matching a search for "zoffix sink";特别注意隐含下沉的缺陷/&unwanted
helper #157 ticket.
我正在尝试查看在接收器上下文中抛出地图的方式。在这段代码中
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, themap
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 在此答案下发表评论,以在此处引发进一步的讨论,看看我们是否可以朝着清晰的方向前进。
Larry begins implementing sink handling in STD (2010)。包括主要是为了确定他开始将 raku 的接收器概念放入代码形式(在 STD 解析器中)的点。
Patrick asks for clarity regarding example
sub foo() { for @list { .say } }; foo(); 1
(2010)。请关注 Patrick 和 Larry (TimToady) 之间关于 Larry 想要什么的对话,忽略旁白。TimToady: "sink context is very important for figuring out awesome error messages" (2012)。 (我认为 raku 的接收器功能是一个极度折磨实现者的问题;请参阅下面的问题跟踪器链接。)
jnthn: "Note that eager context and sink context are different. Sink context should make a for loop (or map) not build a result list" (2012) 这是另一个要下沉上下文的部分。这不仅仅是关于很棒的错误消息;这也与性能有关。
9 open issues in rakudo/rakudo matching a search for "last statement"
Several open issues in rakudo/rakudo matching a search for "zoffix sink";特别注意隐含下沉的缺陷/
&unwanted
helper #157 ticket.