下面引自Qlang的Github页面,
include
在 qlang 中,一个 .ql 文件可以通过 include 文法来将另一个 .ql 的内容包含进来。所谓包含,其实际的能力类似于将代码拷贝粘贴过来。例如,在某个目录下有 a.ql 和 b.ql 两个文件。
其中 a.ql 内容如下:
println("in script A")
foo = fn() {
println("in func foo:", a, b)
}
其中 b.ql 内容如下:
a = 1
b = 2
include "a.ql"
println("in script B")
foo()
如果 include 语句的文件名不是以 .ql 为后缀,那么 qlang 会认为这是一个目录名,并为其补上 “/main.ql” 后缀。也就是说:
include "foo/bar.v1"
等价于:
include "foo/bar.v1/main.ql"
模块及 import
在 qlang 中,模块(module)是一个目录,该目录下要求有一个名为 main.ql 的文件。模块中的标识(ident)默认都是私有的。想要导出一个标识(ident),需要用 export 语法。例如:
a = 1
b = 2
println("in script A")
f = fn() {
println("in func foo:", a, b)
}
export a, f
这个模块导出了两个标识(ident):整型变量 a 和 函数 f。
要引用这个模块,我们需要用 import 文法:
import "foo/bar.v1"
import "foo/bar.v1" as bar2
bar.a = 100 // 将 bar.a 值设置为 100
println(bar.a, bar2.a) // bar.a, bar2.a 的值现在都是 100
bar.f()
qlang 会在环境变量 QLANG_PATH
指示的目录列表中查找 foo/bar.v1/main.ql
文件。如个没有设置环境变量 QLANG_PATH
,则会在 ~/qlang
目录中查找。
将一个模块 import 多次并不会出现什么问题,事实上第二次导入不会发生什么,只是增加了一个别名。
include vs. import
include 是拷贝粘贴,比较适合用于模块内的内容组织。比如一个模块比较复杂,全部写在 main.ql 文件中过于冗长,则可以用 include 语句分解到多个文件中。include 不会通过 QLANG_PATH
来找文件,它永远基于 __dir__
(即 include 代码所在脚本的目录) 来定位文件。
import 是模块引用,适合用于作为业务分解的主要方式。import 基于 QLANG_PATH
这个环境变量搜寻被引用的模块,而不是基于 __dir__
。