提问者:小点点

汇上下文中LOOP_BLOCK_1符号的无用使用


有一个片段就像

perl6 -e 'loop { FIRST say "foo"; last }'

我得到

WARNINGS for -e:
Useless use of LOOP_BLOCK_1 symbol in sink context (line 1)
foo

我知道如何绕过警告。我在想警告的来源是什么。我找到了这张打开的票,但它似乎没有受到任何关注。

这个警告是关于什么的?

这个没用怎么办?

$ perl6 --version
This is Rakudo version 2018.06 built on MoarVM version 2018.06
implementing Perl 6.c.

共1个答案

匿名用户

这是一个bug,一个虚假的警告。

我知道如何绕过警告。

这是主要的事情。

我想知道警告的来源是什么。

这是来自编译器的虚假警告。

我找到了这张公开的票,但它似乎没有受到任何关注。

我想它引起了一些关注。

提交bug的BBKR链接到另一个bug,在其中他们展示了他们的解决方法。(这不是添加do,而是删除FIRST相位器,并将相关语句放在循环之外。)

如果你遵循bbkr原始bug中的其他链接,你会得到另一个bug,解释说一般的“不需要的”机制需要清理。我想可用的圆管集中在更大的鱼上,比如这个整体机制。

希望你能看到这只是一个奇怪的警告信息,在更大的计划中是一个小麻烦。如果你在循环结构中使用第一个相位器,它似乎会出现。它有非常明显的工作,你大概知道,bbkr也展示了。

这个警告是关于什么的?

许多语言允许您混合过程和函数范式。运行过程代码是为了它的副作用。运行函数代码是为了它的结果。一些结构可以两者兼而有之。

但是,如果您使用通常以使用其结果为目的而使用的构造,并且编译器知道这一点,但它也知道它已在其值将被忽略的上下文中使用,该怎么办?

Perls将此称为“在接收器上下文中无用地使用…”,并通常警告编码人员。(“接收器”是其他语言文化中通常称为“无效”上下文的替代/传统术语。)

此错误消息是这些警告之一,尽管是虚假的。

这个没用怎么办?

没什么。

相关的编译器警告机制变得混乱。

消息的“无用使用…在接收器上下文中”部分是通用的,希望是不言自明的。

但是它不可能说“LOOP_BLOCK_1符号”之类的话。那是内部的胡言乱语。

这是bug警告信息。