Chapter 7. 角括弧オーバーロード

多くのプログラミング言語では、角括弧表記は一般に配列の添字を連想させます。例えば、A[i] はC言語における左辺値で、A によって参照された配列の配列セル i を示しています。ATS では、角括弧表記で複数の関数を呼び出せるようにその複数の関数名で角括弧をオーバーロードすることができます。その結果、添字アクセスのような見た目のコードになります。このスタイルの関数呼び出しは、ときに、ATS で書かれたコードをより読み易いものにするでしょう。

ここで、角括弧オーバーロードの単純な例を見てみましょう。次のコードでは、線形抽象型 lock が2つの関数と共に導入されています:

// absvtype lock(a:vt@ype) // extern fun{a:vt0p} lock_acquire(!lock(a)): a extern fun{a:vt0p} lock_release(!lock(a), a): void //

想像できるように、lock_acquire は与えられたロック中に保管された値を得るために呼び出され、lock_release 与えられたロックに値を戻すために呼び出されます。

ここで、次のオーバーロード宣言を導入することを想像してみましょう:

// overload [] with lock_acquire overload [] with lock_release //

この宣言の後で次のコードを型検査を通ります:

// val mylock = $extval(lock(int), "mylock") // val x0 = mylock[] // = lock_acquire (myclok) val () = mylock[] := x0 // = lock_release (myclok, x0) //

代入における角括弧表記は void 値を返す関数のみ参照できることに注意してください。上記の例では、関数 lock_release は void 値を返します。

ATS では、角括弧表記は既にリストの添字指定、配列の添字指定、行列の添字指定の関数でオーバーロードされています。そしてそれは与えれた参照にアクセス/更新するためにも使われます。

この章で示したコードの全体は オンライン から入手できます。