首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在.nqp文件中‘.nqp::in’和‘in’之间有什么区别?

在.nqp文件中‘.nqp::in’和‘in’之间有什么区别?
EN

Stack Overflow用户
提问于 2019-03-11 17:25:29
回答 1查看 114关注 0票数 8

来自World.nqp,第3602行

代码语言:javascript
运行
复制
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行的:

代码语言:javascript
运行
复制
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内置Subs列表

第一个表单nqp::if是在NQP Opcode列表中描述的,但是我找不到第二个表单的文档,尽管它似乎是Rakudo源树中最常见的形式。

为什么NQP中有两种形式的if语句?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-03-11 17:44:19

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

显著的区别是:

  • if语句只能在语句级别出现,而nqp::if(...)可以出现在任何地方。
  • if语句表单在大括号中引入了一个新的词法范围,而nqp::if表单没有这样做。

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

票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55107267

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档