raku - .nqp 文件中的 `nqp::if` 和 `if` 有什么区别?
问题描述
nqp::if(
nqp::istype(nqp::atpos($task,3),$!Block),
QAST::Op.new( :op<call>,
QAST::WVal.new(:value(nqp::atpos($task,3))),
$self,
$getattr
),
nqp::if(
nqp::iseq_i($code,5),
QAST::IVal.new(:value(nqp::atpos($task,3))),
QAST::NVal.new(:value(nqp::atpos($task,3)))
)
),
if $invocant_type =:= $!acc_sig_cache_type {
$sig := $!acc_sig_cache;
}
# First time, create new signature and mark it cached
else {
$sig := $!w.create_signature_and_params(
NQPMu, %sig_empty, $block, 'Any', :method, :$invocant_type);
$!acc_sig_cache := $sig;
$!acc_sig_cache_type := $invocant_type;
}
我认为if
(不带nqp::
)的最后一种形式是不允许的,除非if
是内置的?请参阅NQP 内置子列表。
第一种形式,nqp::if
,在NQP Opcode List中有描述,但是我找不到第二种形式的文档,尽管它似乎是 Rakudo 源代码树中最常见的形式。
if
为什么NQP中有两种形式的语句?
解决方案
NQP 中的if
语句是语言语法的一部分,而不是任何类型的内置例程。它被 NQP 编译器的语法解析并编译成一个 AST 节点。就条件而言,它生成的 AST 节点与 annqp::if
将生成的节点相同(nqp::foo
语法只是创建Op
AST 节点的一种方法)。该cond() ?? foo() !! bar()
语法也可以编译成相同类型的节点。对于完整的 Perl 6 也是如此。
显着的区别是:
- 该
if
语句只能出现在语句级别,而nqp::if(...)
可以出现在任何地方 - 语句形式在
if
花括号内引入了一个新的词法范围,而该nqp::if
形式没有这样做
在链接的示例中,需要表达式形式,因此需要使用nqp::if
构造。但是,??
/!!
也可以使用,并且可以说更具可读性。大多数情况下,由代码的作者决定他们认为最能传达什么或与周围的上下文相匹配。
推荐阅读
- javascript - AG Grid Angular 自定义工具提示不适用于两个组件
- python - 使用 Python 从 Cookie Jar 中提取特定的 Cookie
- python - 将pandas函数实现为numpy函数
- laravel - Laravel - 查询多个对象以过滤记录
- java - 为什么我的共享库 (dll) 没有与 stdc++-6.dll 正确链接?
- c++ - C ++通过索引删除指针向量中的值
- javascript - Javascript,{Object Promise} 加密后发布到 API + 十六进制值
- python-3.x - Python 信号处理程序的执行
- r - 第二行的这个排列函数在这里做什么?
- reactjs - 使用反应路由器和 SSR 设置正确的 HTTP 状态