多くのプログラミング言語では、一般的にいわゆるドット表記は与えられたタプル値、レコード値、オブジェクト値のフィールドを選択するために使われます。ATS では、パターンマッチもしくはドット表記の使用によってフィールドを選択することができます。例えば、次のコードはフラットなタプルとボックス化タプルをコンストラクトしています。そして、それらの構成要素を選択するためにドット表記を使っています:
// val tup_flat = @("a", "b") val tup_boxed = $tup("a", "b") // val-"a" = tup_flat.0 and "b" = tup_flat.1 val-"a" = tup_boxed.0 and "b" = tup_boxed.1 //
オーバーロードにおけるドット表記の例として、2次元空間の点を表わす非線形抽象型 point を導入し、さらに関連する関数群を宣言してみましょう:
// abstype point = ptr // boxed // extern fun point_make (x: double, y: double): point // extern fun point_get_x (p: point): double and point_get_y (p: point): double // extern fun point_set_x (p: point, x: double): void and point_set_y (p: point, x: double): void //
symintr .x .y overload .x with point_get_x overload .x with point_set_x overload .y with point_get_y overload .y with point_set_y
val p0 = point_make (1.0, ~1.0) val x0 = p0.x() // point_get_x (p0) and y0 = p0.y() // point_get_y (p0) val () = p0.x := y0 // point_set_x (p0, y0) and () = p0.y := x0 // point_set_y (p0, x0)
カウンタオブジェクトを表わす線形抽象型 counter と関連するいくつかの関数を導入しましょう:
// absvtype counter = ptr // extern fun counter_make (): counter extern fun counter_free (counter): void // extern fun counter_get (cntr: !counter): int extern fun counter_incby (cntr: !counter, n: int): void //
次のようなオーバーロード宣言を導入したとしましょう:
期待されたるように、これで次のように counter_get を呼び出すことができます: 同様に、c0 に保管されているカウンタを 1 増やすために、次のように counter_incby を呼び出すことができます: もし (非線形の) point の例に戻るのであれば、次のコードもまた型検査に成功します:val p0 = point_make (1.0, ~1.0) val x0 = p0.x() // point_get_x (p0) and y0 = p0.y() // point_get_y (p0) val () = p0.x(y0) // point_set_x (p0, y0) and () = p0.y(x0) // point_set_y (p0, x0)
この章で示したコード全体とテストコードは オンライン から入手できます。