В чем разница между `nqp::if` и`if` в файле.nqp?
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, строка 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 Встроенный список сабвуферов.
Первая форма, nqp::if
, описан в списке кодов операций NQP, однако я не смог найти документацию для второй формы, хотя, похоже, это самая распространенная форма в дереве исходников Rakudo.
Почему существуют две формы if
заявления в NQP?
1 ответ
if
Оператор в NQP является частью синтаксиса языка, а не какой-либо встроенной подпрограммой. Он анализируется грамматикой компилятора NQP и компилируется в узел AST. Узел AST, который он создает, является условным nqp::if
будет производить (nqp::foo
синтаксис просто средство для создания Op
Узлы AST). cond() ?? foo() !! bar()
синтаксис также компилируется в тот же тип узла. Это также верно для полного Perl 6.
Заметные различия:
if
выписка может появляться только на уровне выписки, аnqp::if(...)
может появиться где угодноif
форма заявления вводит новую лексическую область внутри фигурных скобок, в то время какnqp::if
форма не делает этого
В связанном примере желательна форма выражения, таким образом, использование nqp::if
построить. Тем не мение, ??
/!!
также мог бы быть использован и, возможно, был бы более читабельным. Главным образом, именно от автора кода зависит, что, по их мнению, лучше всего передает или соответствует окружающему контексту.