模块(Modules)¶
模块(Modules)¶
模块通过两相关类型,谓词和其他模块组合在一起,提供了一种组织MirrorQL代码的方法。
可以将模块倒入其他的文件,从而避免重复,并有助于将代码结构化为更易于管理的部分。
定义模块(Defining a module)¶
有多种方式来定义模块,这里是最简单的方法的例子,声明一个明确的模块名为Example含有类OneTwoThree:
mod Example {
class OneTwoThree extends int {
fn init() {
self.(int) == 1
or self.(int) == 2
or self.(int) == 3
}
}
}
其中,模块的名称可以是任何以大写或者小写字母开头的标识符。
模块主体(Module bodies)¶
一个模块的主体是模块定义内的代码。通常,模块的主体可以包含以下的构造:
导入模块(Importing modules)¶
将代码存储在模块中的主要好处是可以在其他模块中重用它。要访问外部模块的内容,可以使用use 语句导入模块。
导入模块时,这会将其名称空间内的所有名称都带入当前模块的名称空间内。
use语句¶
导入语句用于导入模块。语法规范如下:
use语句的语法为use 模块路径::实体名,表示将对应模块的实体导入到本模块中。
模块路径有四种形式:
- 绝对路径,例如
java::PTA,表示java包的PTA模块。 self,表示当前模块,常用于导出MirrorQL文件的实体。super,表示上一级模块。package,表示当前包。例如java包文件中的package::PTA与java::PTA等价。 实体名是需要导入的模块、谓词、类型、trait的名称。也可以是通配符*,表示导入对应模块下的所有具名实体。
示例¶
绝对路径(跨package使用)¶
该方法主要是为了跨package使用,例如:java::PTA,其中java 是package.toml文件中 deps 中的库名,PTA表示java 库中src 目录下的文件,各级目录用::分割,且最后一项是所引用文件中的模块、谓词、类型、trait的名称。
注意:¶
- 使用该方式时,需要用
-L来指定java库所在的目录。 - 使用该方式时,项目根目录下必须要有
package.toml文件, 并且使用的库名必须在deps列表中。
示例:
以 example/dep_example中的test为例, 该目录的结构如下:
java库目录结构如下:
执行如下的命令编译:java -jar ../../compiler.jar -L ../ -c, 其中依赖库java 存放在../路径下。编译后的目录结构:
其中,命令行不指定.mql文件时,默认以package.toml中指定的文件执行。
self方式¶
该方式表示指定的路径与正在执行的mql文件在同一个目录下。以example/self_example 为例:
该示例的目录结构如下:
执行如下的命令编译:java -jar ../../compiler.jar -c。编译后的目录结构:
super方式¶
该方式表示指定的路径与正在执行的mql文件的上一级目录下。以example/super_example 为例:
该示例的目录结构:
执行如下的命令编译:java -jar ../../compiler.jar -c。编译后的目录结构:
package方式¶
该方式表示引用的符号还是在本 package内,其中package表示该项目的根目录,也即package.toml 所在的目录,以example/package_example 为例
该示例的目录结构如下:
package_example
├── package.toml
└── src
├── Bar.mql
├── java
│ ├── Other.mql
│ └── edb
│ ├── JavaDocComment.mql
│ └── Literal.mql
└── main.mql
java -jar ../../compiler.jar -c。编译后的目录结构: