我试图找出上述例程和 if 语句之间的区别
say $y.Bool;
say $y.so;
say ? $y;
say so $y;
会产生不同的结果。
到目前为止,对我来说唯一明显的区别是?
优先级高于so
. .Bool
and .so
似乎完全是同义词。这是正确的并且(实际上)是完整的故事吗?
为了回答你的问题,我所做的就是深入研究 Rakudo 编译器源代码。
正如您所注意到的,前缀之间的不同之处之一是解析差异。变体具有不同的优先级并且so
是按字母顺序排列的,而?
是标点符号。要查看控制此解析的精确代码,请查看乐堂的Grammar.nqp https://github.com/rakudo/rakudo/blob/master/src/Perl6/Grammar.nqp并在该页面中搜索prefix:sym<...>
哪里的...
is ?
, so
等等。看起来像三元(... ?? ... !! ...) https://github.com/rakudo/rakudo/blob/master/src/Perl6/Grammar.nqp#L4131-L4145变成一个if
。我发现这些令牌都没有相应的名称Actions.pm6 https://github.com/rakudo/rakudo/blob/master/src/Perl6/Actions.nqp方法。作为一个有点疯狂的猜测,也许与它们相对应的代码生成是由这一部分的method EXPR https://github.com/rakudo/rakudo/blob/master/src/Perl6/Actions.nqp#L7128-L7134。 (任何人都知道或愿意遵循中的说明这篇博文 https://perl6.online/2017/12/23/playing-with-code/找出答案?)
The 中的定义Bool.pm6 https://github.com/rakudo/rakudo/blob/de4e82259be36ac9c97b56d594591ea796a1b131/src/core/Bool.pm6#L66-L100 and Mu.pm6 https://github.com/rakudo/rakudo/blob/7b10a428a5565cf122218523c1bc28c14b3d63aa/src/core/Mu.pm6#L101-L110显示:
In Mu.pm6
方法.Bool
回报False
对于未定义的对象和.defined
否则。反过来.defined
回报False
对于未定义的对象和True
否则。所以这些都是默认的。
.defined被记录为在两个内置类中被重写 https://docs.perl6.org/routine/defined and .Bool in 19 https://docs.perl6.org/routine/Bool.
so
, .so
, and ?
都调用相同的代码Bool
/ .Bool
。理论上,类/模块可以覆盖它们,而不是或者也可以覆盖.Bool
or .defined
,但我不明白为什么有人会在内置类/模块或用户态类/模块中这样做。
not
and !
是相同的(除了use of ! with :exists dies https://github.com/rakudo/rakudo/blob/de4e82259be36ac9c97b56d594591ea796a1b131/src/core/Bool.pm6#L79-L81)并且都变成了对nqp::hllbool(nqp::not_i(nqp::istrue(...)))
。我认为他们没有经历平常的主要原因.Bool
路线是要避开标记处理Failures https://github.com/rakudo/rakudo/blob/f02856d3ecc11a11209f2def38b6ef8c341a52ff/src/core/Failure.pm6#L57-L72.
有.so
and .not
中定义的方法Mu.pm6
。他们只是打电话.Bool
.
有一些布尔按位运算符,其中包括?
。他们与您的问题相距甚远,但他们的代码包含在上面的链接中。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)