为什么Rakudo&s src / core / Int.pm中的所有课程都与我一起宣布?

时间:2017-06-12 22:31:58

标签: perl6 lexical-scope

查看source for Int,我看到所有类都使用enum class Step : () -> Step { Step1 { override fun invoke() = Step2 }, Step2 { override fun invoke() = End }, End { override fun invoke() = this } } fun work() { var step = Step.Step1 while (step !== Step.End) { step = step() } } 声明,我原本认为这些类会将它们设为私有而在该文件之外不可用。但是,他们显然是。为什么他们需要这样宣布?

my

我认为BOOTSTRAP评论与它有关。在Perl6/Metamodel/BOOTSTRAP.nqp中有以下行:

my class Rat { ... }
my class X::Numeric::DivideByZero { ... }
my class X::NYI::BigInt { ... }

my class Int { ... }
my subset UInt of Int where {not .defined or $_ >= 0};

my class Int does Real { # declared in BOOTSTRAP

1 个答案:

答案 0 :(得分:7)

Rakudo的src/core/目录中的文件不会编译为具有自己的专用文件级范围的单独模块,而是在构建过程中连接成单个文件,例如gen/moar/CORE.setting

从语义上讲,这种“设置”(在其他语言中称为“前奏”)构成了一个隐含在你的程序周围的外部词汇范围。

S02: Pseudo-packages中描述了该设计,该部分的部分已将其设为official documentation