raku - .nqp 文件中的 `nqp::if` 和 `if` 有什么区别?

标签 raku nqp

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

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

最佳答案

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

显着的差异是:

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

  • 在链接的示例中,需要表达形式,因此使用 nqp::if构造。然而,??/!!也可以使用,并且可以说更具可读性。大多数情况下,由代码的作者来决定他们认为什么最适合交流或与周围的上下文相匹配。

    关于raku - .nqp 文件中的 `nqp::if` 和 `if` 有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55107267/

    相关文章:

    raku - 可以插入无符号变量或常量吗?

    grammar - 对文件进行语法子解析

    utf-8 - 我可以问 Perl 6 的 LWP::Simple 来处理格式错误的 UTF-8 吗?

    raku - 私有(private)属性的绑定(bind):nqp::bindattr vs :=

    raku - 在不显式导出的情况下获取模块的 Pod

    lazy-evaluation - Perl 6 中嵌套和非嵌套映射的上下文有什么区别?

    lazy-evaluation - 意外的非懒惰

    regex - 是否可以在语法 nqp 中运行子语法?

    sockets - 有没有办法在 Perl 6 中处理 Unix 套接字?

    raku - Raku Regex中单管道和双管道之间的差异(| Vs ||)