模块

    编译模块的算法是:

    • 像往常一样编译整个模块,递归地执行import语句
    • 如果有一个只导入已解析的(即导出的)符号的环;如果出现未知标识符则中止 这可以通过一个例子来说明:
    1. # 模块 B
    2. import A # 这里没有解析A,仅导入已知的A符号。
    3.  
    4. # 这是有效的,因为编译器已经将T1添加到A的接口符号表中
    5. result = x + 1

    import 语句之后,可以跟随模块名称列表或单个模块名称后跟 except 列表以防止导入某些符号:

    1. import strutils except `%`, toUpperAscii
    2.  
    3. # 行不通:
    4. echo "$1" % "abc".toUpperAscii

    没有检查 except 列表是否真的从模块中导出。 此功能允许针对不导出这些标识符的旧版本模块进行编译。

    Include语句

    include 语句与导入模块有着根本的不同:​​它只包含文件的内容。 include 语句对于将大模块拆分为多个文件很有用:

    1. include fileA, fileB, fileC

    可以通过 as 关键字引入模块别名:

    1. import lib/pure/os, "lib/pure/times"

    请注意,模块名称仍然是 strutils 而不是 lib/pure/strutils 因此 无法 做:

    1. import lib/pure/strutils
    2. echo lib/pure/strutils.toUpperAscii("abc")

    同样,以下内容没有意义,因为名称已经是 strutils

    1. import lib/pure/strutils as strutils

    从目录中集体导入

    语法 import dir / [moduleA, moduleB] 可用于从同一目录导入多个模块。

    路径名在语法上是Nim标识符或字符串文字。如果路径名不是有效的Nim标识符,则它必须是字符串文字:

    目录也可以是所谓的“伪目录”。当存在多个具有相同路径的模块时,它们可用于避免歧义。

    1. std: std 伪目录是Nim标准库的抽象位置。 例如,语法 import std / strutils 用于明确地引用标准库的 strutils 模块。

    From import语句

    from 语句之后,一个模块名称后面跟着一个 import 来列出一个人喜欢使用的符号而没有明确的完全限定:

    1. from strutils import `%`
    2.  
    3. echo "$1" % "abc"
    4. # 可能:完全限定:
    5. echo strutils.replace("abc", "a", "z")

    如果想要导入模块但是想要对 module 中的每个符号进行完全限定访问,也可以使用 from module import nil

    export 语句可用于符号转发,因此客户端模块不需要导入模块的依赖项:

    1. # 模块B
    2. type MyObject* = object
    1. # 模块A
    2. import B
    3. export B.MyObject
    4.  
    5. proc `$`*(x: MyObject): string = "my object"

    请注意,导出时,只需指定模块名称:

    1. export baz