在.nqp文件中`nqp :: if`和`if`有什么区别?

问题描述 投票:8回答:1

来自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::ifNQP Opcode List中描述,但是我找不到第二种形式的文档,尽管它似乎是Rakudo源代码树中最常见的形式。

为什么NQP中有两种形式的if陈述?

perl6 nqp
1个回答
8
投票

NQP中的if语句是语言语法的一部分,而不是任何类型的内置例程。它由NQP编译器的语法解析并编译成AST节点。它产生的AST节点,就条件而言,与nqp::if产生的相同(nqp::foo语法只是创建Op AST节点的一种方法)。 cond() ?? foo() !! bar()语法也编译成相同类型的节点。对于完整的Perl 6也是如此。

显着的差异是:

  • if语句只能出现在语句级别,而nqp::if(...)可以出现在任何地方
  • if语句形式在花括号内部引入了一个新的词法范围,而nqp::if形式不会这样做

在链接的例子中,需要表达形式,因此使用nqp::if构造。然而,?? / !!也可以被使用,并且可以说更具可读性。大多数情况下,由代码的作者决定他们认为最佳通信或与周围环境匹配。

© www.soinside.com 2019 - 2024. All rights reserved.