有一个片段就像
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.
这是一个bug,一个虚假的警告。
我知道如何绕过警告。
这是主要的事情。
我想知道警告的来源是什么。
这是来自编译器的虚假警告。
我找到了这张公开的票,但它似乎没有受到任何关注。
我想它引起了一些关注。
提交bug的BBKR链接到另一个bug,在其中他们展示了他们的解决方法。(这不是添加do
,而是删除FIRST
相位器,并将相关语句放在循环之外。)
如果你遵循bbkr原始bug中的其他链接,你会得到另一个bug,解释说一般的“不需要的”机制需要清理。我想可用的圆管集中在更大的鱼上,比如这个整体机制。
希望你能看到这只是一个奇怪的警告信息,在更大的计划中是一个小麻烦。如果你在循环结构中使用第一个相位器,它似乎会出现。它有非常明显的工作,你大概知道,bbkr也展示了。
这个警告是关于什么的?
许多语言允许您混合过程和函数范式。运行过程代码是为了它的副作用。运行函数代码是为了它的结果。一些结构可以两者兼而有之。
但是,如果您使用通常以使用其结果为目的而使用的构造,并且编译器知道这一点,但它也知道它已在其值将被忽略的上下文中使用,该怎么办?
Perls将此称为“在接收器上下文中无用地使用…”,并通常警告编码人员。(“接收器”是其他语言文化中通常称为“无效”上下文的替代/传统术语。)
此错误消息是这些警告之一,尽管是虚假的。
这个没用怎么办?
没什么。
相关的编译器警告机制变得混乱。
消息的“无用使用…在接收器上下文中”部分是通用的,希望是不言自明的。
但是它不可能说“LOOP_BLOCK_1符号”之类的话。那是内部的胡言乱语。
这是bug警告信息。