模块

Nim支持通过模块概念将程序拆分为多个部分。 每个模块都需要在自己的文件中,并且有自己的 命名空间 。 模块启用 信息隐藏 and 分开编译 。 模块可以通过 import 语句访问另一个模块的符号。 递归模块依赖 是允许的,但有点微妙。 仅导出标有星号(*)的顶级符号。 有效的模块名称只能是有效的Nim标识符(因此其文件名为 标识符.nim )。

编译模块的算法是:

  • 像往常一样编译整个模块,递归地执行import语句
  • 如果有一个只导入已解析的(即导出的)符号的环;如果出现未知标识符则中止

这可以通过一个例子来说明:

  1. # 模块A
  2. type
  3. T1* = int # 模块A导出类型 ``T1``
  4. import B # 编译器开始解析B
  5.  
  6. proc main() =
  7. var i = p(3) # 因为B在这里被完全解析了
  8.  
  9. main()
  1. # 模块 B
  2. import A # 这里没有解析A,仅导入已知的A符号。
  3.  
  4. proc p*(x: A.T1): A.T1 =
  5. # 这是有效的,因为编译器已经将T1添加到A的接口符号表中
  6. result = x + 1