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中有两种形式的语句?