.Bool,.so 、?之间的区别 所以

ozz*_*zzy 10 perl6 boolean-operations

我正在尝试找出上述例程之间的区别以及if语句是否像

say $y.Bool;
say $y.so;
say ? $y;
say so $y;
Run Code Online (Sandbox Code Playgroud)

会产生不同的结果。

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

rai*_*iph 8

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

如您所注意到的,前缀之间的不同是解析差异。变体具有不同的优先级,so并且按字母顺序,而?标点符号。要查看精确的代码控制这个分析,查看Rakudo的Grammar.nqp该网页中搜索prefix:sym<...>的地方...?so等它看起来像三元(... ?? ... !! ...变成一个if。我看到这些标记都没有相应命名的Actions.pm6方法。有点疯狂的猜测,也许与之对应的代码生成是由的这一部分method EXPR处理。(任何人都知道,还是愿意按照此博客文章中的说明进行查找?)

在定义Bool.pm6Mu.pm6表明:

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

  • .defined记录在两个内置类.Bool19中被重写

  • so.so?所有的呼叫相同的代码可推迟到Bool/ .Bool。从理论上讲,类/模块可以替代它们,或者也可以替代.Bool.defined,但是我看不出为什么有人会在内置类/模块或用户级模块中这样做。

  • not!是相同的(除了with with die的使用!:exists以外),并且两者都变成了对的调用nqp::hllbool(nqp::not_i(nqp::istrue(...)))。我认为它们不遵循常规方法的主要原因.Bool是为了避免Failures进行标记处理

  • 中定义了.so.not方法Mu.pm6。他们只是打电话.Bool

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