通过 CALL-ME 解除沉没的呼叫

jjm*_*elo 5 raku

While trying to come up with an example of maps in sunk context, I bumped into this code:

my $a = -> { 42 };
my $b = -> { "foo" };

$a;
$a();

($a,$b).map: { $_ };
Run Code Online (Sandbox Code Playgroud)

The first call to $a by itself returns:

WARNINGS for /home/jmerelo/Code/raku/my-raku-examples/sunk-map.p6:
Useless use of $a in sink context (line 6)
Run Code Online (Sandbox Code Playgroud)

However, putting .() or () behind, or using them in (what I though it was) sink context in a map didn't result in any warning. Probably it's not sink context, but I would like to know why.

rai*_*iph 5

$a;
$a();
($a,$b).foo ...
Run Code Online (Sandbox Code Playgroud)

第一次调用$a本身

这不是“召唤”。这只是提到它又名“使用”。(注:这个,呃,使用“使用”无关用关键字useuse声明。)

/home/jmerelo/Code/raku/my-raku-examples/sunk-map.p6 的警告:在接收器上下文中无用地使用 $a(第 6 行)

对。就这么提是没用的。您不会对(已分配函数)的值执行任何操作$a。你只要把它放在地板上。

但是,在地图中的接收器上下文中放置.()或放置或()使用它们(我认为它是)不会导致任何警告。

对。那些.CALL-ME在他们的左手边被调用的原因。无论代码是否使用调用返回的任何值,这些都被理解为潜在有用。因此,尽管处于接收器上下文中,但没有警告(尽管接收器上下文本身可能依赖于上下文,并且在编译器级别,它们甚至不被视为处于接收器上下文中;我不知道)。

参见我对 perl 中类似情况的评论