Gox语言中引用外部代码或模块-GX15

下面引自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__

猜你喜欢

转载自blog.csdn.net/weixin_41462458/article/details/107912269