跳转至

模块(Modules)

模块(Modules)

定义模块(Defining a module)

模块主体(Module bodies)

  导入模块(Importing modules)

  use语句

   示例

    绝对路径

    self方式

    super方式

    package方式

模块(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::PTAjava::PTA等价。 实体名是需要导入的模块、谓词、类型、trait的名称。也可以是通配符*,表示导入对应模块下的所有具名实体。

示例

绝对路径(跨package使用)

该方法主要是为了跨package使用,例如:java::PTA,其中javapackage.toml文件中 deps 中的库名,PTA表示java 库中src 目录下的文件,各级目录用::分割,且最后一项是所引用文件中的模块、谓词、类型、trait的名称

注意:

  • 使用该方式时,需要用-L来指定java库所在的目录。
  • 使用该方式时,项目根目录下必须要有package.toml文件, 并且使用的库名必须在deps 列表中。

示例: 以 example/dep_example中的test为例, 该目录的结构如下:

test
├── package.toml
└── src
    └── test.mql
依赖的库java库目录结构如下:
java
├── package.toml
└── src
    ├── Other.mql
    └── edb
        ├── JavaDocComment.mql
        └── Literal.mql
执行如下的命令编译:java -jar ../../compiler.jar -L ../ -c, 其中依赖库java 存放在../路径下。编译后的目录结构:
.
├── main.mql.dl
├── package.toml
└── src
    └── main.mql
其中,命令行不指定.mql文件时,默认以package.toml中指定的文件执行。

self方式

该方式表示指定的路径与正在执行的mql文件在同一个目录下。以example/self_example 为例: 该示例的目录结构如下:

self_example
├── package.toml
└── src
    ├── Bar.mql
    └── main.mql

执行如下的命令编译:java -jar ../../compiler.jar -c。编译后的目录结构:

.
├── main.mql.dl
├── package.toml
└── src
    ├── Bar.mql
    └── main.mql

super方式

该方式表示指定的路径与正在执行的mql文件的上一级目录下。以example/super_example 为例:

该示例的目录结构:

.
├── Bar.mql
├── package.toml
└── src
    └── main.mql
执行如下的命令编译:java -jar ../../compiler.jar -c。编译后的目录结构:
.
├── Bar.mql
├── main.mql.dl
├── package.toml
└── src
    └── main.mql

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。编译后的目录结构:
.
├── main.mql.dl
├── package.toml
└── src
    ├── Bar.mql
    ├── java
    │   ├── Other.mql
    │   └── edb
    │       ├── JavaDocComment.mql
    │       └── Literal.mql
    └── main.mql