软件包
Flux 源代码被组织成包。
一个包包含一个或多个源文件。
每个源文件被单独解析并组合成一个单一的包。
File = [ PackageClause ] [ ImportList ] StatementList .
ImportList = { ImportDeclaration } .
包语句
PackageClause = [ Attributes ] "package" identifier .
一个 包声明 定义当前包的名称。
包名称必须是有效的 Flux 标识符。
包声明必须位于任何 Flux 源文件的开头。
在同一包中的所有文件必须声明相同的包名称。
当一个文件没有声明包声明时,该文件中的所有标识符将属于特殊的 main 包。
主包
main 包是特殊的,原因有几点:
- 它定义了一个 Flux 程序的入口点。
- 无法导入。
- 所有语句都被标记为产生副作用。
导入声明
ImportDeclaration = [ Attributes ] "import" [identifier] string_lit
每个包都关联有一个包名称和一个导入路径。
导入语句获取一个包的导入路径,并将该包中定义的所有标识符引入当前作用域下的命名空间。
导入语句定义了访问导入标识符的命名空间。
默认情况下,该命名空间的标识符是包名称,除非另有指定。
例如,给定在包 foo 中声明的变量 x,导入 foo 并引用 x 将看起来像这样:
import "import/path/to/package/foo"
foo.x
或者这个:
import bar "import/path/to/package/foo"
bar.x
包的导入路径始终是绝对的。
包可以为它所导入的某个包中声明的选项标识符重新赋值。
包无法访问或修改属于其导入包的被导入包的标识符。
每个包含在导入包中的语句都会被评估。
包初始化
软件包按以下顺序初始化:
- 所有导入的包都已初始化并分配给它们的包标识符。
- 所有选项声明都会被评估并分配,无论顺序如何。 一个选项不能依赖于在同一个包块中分配的另一个选项。
- 所有变量声明都会被评估和赋值,顺序无关。一个变量不能对自身有直接或间接的依赖。
- 任何包的副作用都会被评估。
一个包只会在所有文件块和所有包块中初始化一次,无论它被导入多少次。
初始化导入的包必须是确定性的。 具体来说,在所有导入的包初始化后,每个选项必须分配相同的值。 在同一个文件块中导入的包按声明顺序初始化。 跨不同文件块导入的包没有已知顺序。 当一组导入修改同一个选项时,必须通过将它们放在同一个文件块中来排序。