模块
Nim支持通过模块概念将程序拆分为多个部分。 每个模块都需要在自己的文件中,并且有自己的 命名空间 。 模块启用 信息隐藏 and 分开编译 。 模块可以通过 import 语句访问另一个模块的符号。 递归模块依赖 是允许的,但有点微妙。 仅导出标有星号(*
)的顶级符号。 有效的模块名称只能是有效的Nim标识符(因此其文件名为 标识符.nim )。
编译模块的算法是:
- 像往常一样编译整个模块,递归地执行import语句
- 如果有一个只导入已解析的(即导出的)符号的环;如果出现未知标识符则中止
这可以通过一个例子来说明:
- # 模块A
- type
- T1* = int # 模块A导出类型 ``T1``
- import B # 编译器开始解析B
- proc main() =
- var i = p(3) # 因为B在这里被完全解析了
- main()
- # 模块 B
- import A # 这里没有解析A,仅导入已知的A符号。
- proc p*(x: A.T1): A.T1 =
- # 这是有效的,因为编译器已经将T1添加到A的接口符号表中
- result = x + 1