我一直在乐道源代码中寻找require
的实现,首先是出于好奇,其次是因为我想知道它是否返回了一些东西。
我查了sub require
,它返回了这个命中,这实际上似乎是 require 的来源,但它被称为sub REQUIRE_IMPORT
.它返回Nil
并声明为这样,这几乎回答了我最初的问题。但现在我的问题是:从那个潜艇到require
的映射在哪里?它真的是该函数的实现吗?是否还有其他一些以这种方式声明的函数?
require
不是子控件,而是一个语句控件(因此,在相同的类别中,如use
,if
,for
等)它由 Perl 6 语法解析,并且有几种不同的情况被接受。它是在 Perl 6 动作中编译的,它有很多事情要处理。
大部分工作被委托给各种CompUnit
对象,这些对象也涉及use
/need
。它还必须处理require
将引入的存根符号,因为给定词法范围内的符号集在编译时是固定的,并且REQUIRE_IMPORT
实用程序子也涉及运行时符号导入。
关于它将评估什么的问题的答案在方法结束时:
$past.push($<module_name>
?? self.make_indirect_lookup($longname.components())
!! $<file>.ast);
这意味着:
- 如果是
require Some::Module
则计算为查找Some::Module
- 如果是
require $file
样式案例,请计算文件名