Chapter 5. 静的ロード (staload)

ATS では、静的ロード (もしくは staload と略します) はロードされるパッケージ中で宣言された名前に対する名前空間を生成します。

foo.sats という名前のファイルが次のコードを含んでいると考えます:

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

次の staload 宣言は、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 を次のように2度 staload した場合:

staload FOO2 = "foo.sats"

すると foo.sats は実際にはコンパイラによってロードされません。 その代わり、FOO の別名として FOO2 が単に作られます。

foo.sats は次のようにも staload できます:

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 は最初に、同一ファイル中で宣言された有効な名前を検索することで、名前の束縛を解決するからです。