.nqp 文件中的 `nqp::if` 和 `if` 有什么区别?
What is the difference between `nqp::if` and `if` in an .nqp file?
来自 World.nqp, line 3602 :
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)))
)
),
而来自 World.nqp, line 3314 :
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 Built-in Subs List。
第一种形式 nqp::if
在 NQP Opcode List 中进行了描述,
但是我找不到第二种形式的文档,不过
它似乎是 Rakudo 源代码树中最常见的形式。
为什么NQP中有两种形式的if
语句?
NQP 中的 if
语句是语言语法的一部分,而不是任何一种内置例程。它被NQP编译器的语法解析并编译成一个AST节点。就条件而言,它生成的 AST 节点与 nqp::if
生成的节点相同(nqp::foo
语法只是创建 Op
AST 节点的一种方式)。 cond() ?? foo() !! bar()
语法也编译成相同类型的节点。完整的 Perl 6 也是如此。
显着差异是:
if
语句只能出现在语句级别,而nqp::if(...)
可以出现在任何地方
if
语句形式在大括号内引入了一个新的词法作用域,而 nqp::if
形式没有这样做
在链接示例中,需要表达式形式,因此使用了 nqp::if
结构。但是,??
/!!
也可以使用,并且可以说更具可读性。大多数情况下,由代码的作者决定他们认为什么最能传达或匹配周围的上下文。
来自 World.nqp, line 3602 :
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)))
)
),
而来自 World.nqp, line 3314 :
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 Built-in Subs List。
第一种形式 nqp::if
在 NQP Opcode List 中进行了描述,
但是我找不到第二种形式的文档,不过
它似乎是 Rakudo 源代码树中最常见的形式。
为什么NQP中有两种形式的if
语句?
NQP 中的 if
语句是语言语法的一部分,而不是任何一种内置例程。它被NQP编译器的语法解析并编译成一个AST节点。就条件而言,它生成的 AST 节点与 nqp::if
生成的节点相同(nqp::foo
语法只是创建 Op
AST 节点的一种方式)。 cond() ?? foo() !! bar()
语法也编译成相同类型的节点。完整的 Perl 6 也是如此。
显着差异是:
if
语句只能出现在语句级别,而nqp::if(...)
可以出现在任何地方if
语句形式在大括号内引入了一个新的词法作用域,而nqp::if
形式没有这样做
在链接示例中,需要表达式形式,因此使用了 nqp::if
结构。但是,??
/!!
也可以使用,并且可以说更具可读性。大多数情况下,由代码的作者决定他们认为什么最能传达或匹配周围的上下文。