我一直在寻找Rakudo的源代码来实现require
,首先是出于好奇,其次是因为我想知道它是否正在返回一些东西。
我查了一下sub require
,它返回了这个 hit,这实际上似乎是 require 的来源,但它被称为sub REQUIRE_IMPORT
. 它返回Nil
并被声明为这样,这几乎回答了我原来的问题。但现在我的问题是:从那个 sub 到的映射在哪里require
?它真的是该功能的实现吗?是否还有其他一些以这种方式声明的函数?
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
样式案例,请评估文件名