.Bool,.so 、?之间的区别等等

时间:2019-06-23 12:40:46

标签: perl6 boolean-operations

我试图弄清楚上述例程与if语句之类的区别

say $y.Bool;
say $y.so;
say ? $y;
say so $y;

将产生不同的结果。

到目前为止,对我而言,唯一显而易见的区别是?的优先级高于so.Bool.so似乎是完全同义的。那是正确的,(实际上)是全文吗?

1 个答案:

答案 0 :(得分:8)

我为回答您的问题所做的工作是拼写Rakudo编译器源代码。

您注意到,前缀之间的不同之处在于解析差异。变体具有不同的优先级,并且so是字母,而?是标点。要查看控制该解析的精确代码,请查看Rakudo's Grammar.nqp并在该页面中搜索prefix:sym<...>,其中...?so等。看起来像ternary (... ?? ... !! ...)变成if。我看到这些标记都没有相应地命名为Actions.pm6方法。作为一个有点疯狂的猜测,也许与它们相对应的代码生成是由this part of method EXPR处理的。 (有人知道,还是愿意按照this blog post中的说明进行查找?)

definitions in Bool.pm6Mu.pm6显示:

  • Mu.pm6中,方法.Bool返回False用于未定义对象,否则返回.defined。反过来,.defined为未定义的对象返回False,否则返回True。因此,这些是默认设置。

  • .defined is documented as overridden in two built in classes.Bool in 19

  • so.so?都调用相同的代码,以符合Bool / .Bool的要求。从理论上讲,类/模块可以覆盖它们,而不是覆盖.Bool.defined,但是我看不出为什么有人会在内置的类/模块或用户级的。

  • not!是相同的(除了use of ! with :exists dies),它们都变成对nqp::hllbool(nqp::not_i(nqp::istrue(...)))的调用。我认为他们不遵循常规的.Bool路线的主要原因是避免使用marking handling of Failures

  • .so中定义了.notMu.pm6个方法。他们只是打.Bool

  • 存在包含?的布尔按位运算符。它们与您的问题相距遥远,但是它们的代码包含在上面的链接中。