2.14. 模块

模块提供代码重用的基础结构,以及向 Daslang 公开 C++ 功能的机制。 模块是类型、常量和函数的集合。 模块可以是 Daslang 原生的,也可以是内置的。

要请求一个模块,请使用 require 关键字:

require math
require ast public
require daslib/ast_boost

public 修饰符表示包含的模型对包括当前模块在内的所有内容都是可见的。

模块名称可能包含 /. 符号。 项目负责将模块名称解析为文件名(参阅 Project).

2.14.1. 原生模块

原生模块是一个单独的 Daslang 文件,具有可选的 module 名称:

module custom       // 指定模块名称
...
def foo             // 在模块中定义函数
...

如果未指定,则模块名称默认为文件名的名称。

模块可以是 privatepublic:

module Foo private

module Foo public

函数、结构或枚举的默认公开是模块的公开(即,如果模块是公共的并且未指定函数的公开,则该函数是公共的)。

2.14.2. 内置模块

内置模块是向 Daslang 公开 C++ 功能的方式 (参阅 Builtin modules).

2.14.3. 共享模块

共享模块是在多个上下文的编译之间共享的模块。 通常,每个上下文都会重新编译模块,但是当指定 ‘shared’ 关键字时,模块会提升为内置模块:

module Foo shared

这样,每个编译环境只创建一个模块实例。 共享模块中的宏不能期望模块是唯一的,因为可以通过策略代码禁用模块的共享。

2.14.4. 模块函数可见性

调用函数时,可以显式或隐式指定模块的名称:

let s1 = sin(0.0)           // implicit, assumed math::sin
let s2 = math::sin(0.0)     // explicit, always math::sin

如果该模块中不存在该函数,则会发生编译错误。 如果函数是私有的或不直接可见的,则会发生编译错误。 如果多个函数匹配隐式函数,则会出现编译错误。

模块名称 ___ 保留用于分别指定 ‘当前模块’ 和 ‘仅当前模块’。 它对于泛型函数尤其重要,这些函数在当前模块中总是实例化为私有函数:

module b

[generic]
def from_b_get_fun_4() {
    return  _::fun_4()      //  call `fun_4', as if it was implicitly called from b
}

[generic]
def from_b_get_fun_5() {
    return  __::fun_5()     // always b::fun_5
}

指定空前缀与不指定前缀相同。

如果没有 ___ 模块前缀,被覆盖的函数在泛型中将不可见。 这就是为什么 :=delete 作符总是被 _::clone_::finalize 调用所取代。