6

我一直在寻找Rakudo的源代码来实现require,首先是出于好奇,其次是因为我想知道它是否正在返回一些东西。

我查了一下sub require,它返回了这个 hit,这实际上似乎是 require 的来源,但它被称为sub REQUIRE_IMPORT. 它返回Nil并被声明为这样,这几乎回答了我原来的问题。但现在我的问题是:从那个 sub 到的映射在哪里require?它真的是该功能的实现吗?是否还有其他一些以这种方式声明的函数?

4

1 回答 1

7

require不是 sub,而是语句控件(因此,在同一类别中,例如use, if,for等)它由 Perl 6 语法解析,并且有几种不同的情况被接受。它是在 Perl 6 操作中编译的,它有很多需要处理的地方。

大部分工作都委托给各种CompUnit对象,这些对象也与use/相关need。它还必须处理require将引入的存根符号,因为给定词法范围内的符号集在编译时是固定的,并且REQUIRE_IMPORT实用程序 sub 也涉及运行时符号导入。

关于它将评估为什么的问题的答案出现在方法的末尾:

    $past.push($<module_name>
               ?? self.make_indirect_lookup($longname.components())
               !! $<file>.ast);

意思是:

  • 如果是,require Some::Module则评估为查找Some::Module
  • 如果是require $file样式案例,请评估文件名
于 2018-12-05T11:39:15.507 回答