В чем разница между `nqp :: if` и` if` в файле .nqp? - PullRequest
8 голосов
/ 11 марта 2019

С 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.

Почему в NQP есть две формы операторов if?

1 Ответ

8 голосов
/ 11 марта 2019

Оператор if в NQP является частью синтаксиса языка, а не какой-либо встроенной подпрограммой. Он анализируется грамматикой компилятора NQP и компилируется в узел AST. Узел AST, который он создает, является условным, тем же, что и nqp::if (синтаксис nqp::foo - это просто средство для создания Op узлов AST). Синтаксис cond() ?? foo() !! bar() также компилируется в узлы того же типа. Это также верно для полного Perl 6.

Заметные различия:

  • Оператор if может появляться только на уровне оператора, тогда как nqp::if(...) может появляться где угодно
  • Форма оператора if вводит новую лексическую область видимости внутри фигурных скобок, тогда как форма nqp::if этого не делает

В связанном примере желательна форма выражения, поэтому используется конструкция nqp::if. Тем не менее, ?? / !! также можно было бы использовать и, возможно, было бы более читабельным. Главным образом, именно от автора кода зависит, что, по их мнению, лучше всего сообщается или соответствует окружающему контексту.

...