В чем разница между `nqp::if` и`if` в файле.nqp?

Из World.nqp, строка 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, строка 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 построить. Тем не мение, ??/!! также мог бы быть использован и, возможно, был бы более читабельным. Главным образом, именно от автора кода зависит, что, по их мнению, лучше всего передает или соответствует окружающему контексту.

Другие вопросы по тегам