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似乎是完全同义。这是正确的,(实际上)是完整的故事吗?
我为回答您的问题所做的工作是拼写Rakudo编译器的源代码。
如您所注意到的,前缀之间的不同是解析差异。变体具有不同的优先级,so并且按字母顺序,而?标点符号。要查看精确的代码控制这个分析,查看Rakudo的Grammar.nqp该网页中搜索prefix:sym<...>的地方...是?,so等它看起来像三元(... ?? ... !! ...)变成一个if。我看到这些标记都没有相应命名的Actions.pm6方法。有点疯狂的猜测,也许与之对应的代码生成是由的这一部分method EXPR处理的。(任何人都知道,还是愿意按照此博客文章中的说明进行查找?)
将在定义Bool.pm6和Mu.pm6表明:
在Mu.pm6方法中,.Bool返回False未定义的对象,.defined否则返回。依次.defined返回False未定义的对象,True否则返回。因此,这些是默认设置。
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。
有包含的布尔按位运算符?。它们与您的问题相去甚远,但它们的代码包含在上面的链接中。