Chapter 5. 静态加载

在ATS中,静态加载(简称staload)指的是一个在加载包中填入声明名称的命名 空间的创建。

假设有一个名为foo.sats的文件,它包含下面几行代码:

// datatype aDatatype = | A | B of (int, int) // val aValue: int fun aFunction: int -> int //

下面的静态加载声明(为foo.sats中声明的名字)引入了一个命名空间FOO:

staload FOO = "foo.sats"

若要引用命名空间FOO中的一个名字,则需将前缀$FOO.加在该名字 前。例如,下面的代码全部引用了命名空间FOO中的可用名称:

val a: $FOO.aDatatype = $FOO.A() val b: $FOO.aDatatype = $FOO.B(0, $FOO.aFunction($FOO.aValue))

如果文件foo.sats被再次静态加载如下:

staload FOO2 = "foo.sats"

则foo.sats实际上不会被编译器加载的,相反,FOO2仅仅是 FOO的别名。

也允许foo.sats被静态加载如下:

staload "foo.sats"

在这种情况下,foo.sats文件中被声明的名称所在的命名空间是开放的。例如: 下面的代码显示这些名称能直接被引用:

val a: aDatatype = A() val b: aDatatype = B(0, aFunction(aValue))

我们假设有下面的声明序列:

val aValue = 0 staload "foo.sats" val anotheValue = aValue + 1

第二次出现的aValue是引用第一次声明中提及的那个,还是指的是 foo.sats内部所声明的那个?答案可能有点让人意外:它引用在同一文件中ATS通 过搜索出现的第一个可用声明的名字。