代码之家  ›  专栏  ›  技术社区  ›  Håkon Hægland

.nqp文件中的“nqp::if”和“if”有什么区别?

  •  0
  • Håkon Hægland  · 技术社区  · 7 年前

    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:: 是一个内置的?看到了吗 NQP Built-in Subs List .

    nqp::if ,如中所述 NQP Opcode List 但是,我找不到第二个表单的文档

    为什么有两种形式的 如果 NQP中的声明?

    0 回复  |  直到 6 年前
        1
  •  9
  •   Jonathan Worthington    7 年前

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

    显著的区别是:

    • 如果 语句只能出现在语句级别,而 nqp::if(...) 可以出现在任何地方
    • 语句表单在花括号中引入了一个新的词汇作用域,而 nqp::如果

    在链接的示例中,需要表达式形式,因此 ?? / !! 也可以被使用,而且可以说更具可读性。大多数情况下,这只是由代码的作者来决定他们认为什么是最好的沟通或匹配周围的环境。

    推荐文章