Chapter 25. extvar 宣言

ATS は他のプログラミング言語との相互利用を重要視しています。

C言語コード中に foo という名前の (グローバルの) 整数変数を持ち、ATS コード中で foo に保管された値を 1 増加させたいとします。これは次のように書けます:

val x0 = $extval(int, "foo") // get the value of foo val p_foo = $extval(ptr, "&foo") // get the address of foo val () = $UNSAFE.ptr_set<int> (p_foo, x0 + 1) // update foo

このとき foo のアドレスを得るためにC言語のアドレス演算子 (&) が必要です。もしアドレス演算子をサポートしていない言語 (例: JavaScript や Python) と ATS を相互利用するのであれば、次のように書くことができます:

extvar "foo" = x0 + 1

このときキーワード extvar は続く文字列が外部の変数 (もしくは左辺値) を参照していることを示しています。その変数は、その文字列に続く等式記号の右辺の式の値で更新されます。このいわゆる extvar 宣言は次のように書くこともできます:

extern var "foo" = x0 + 1

このとき extvarextern var に展開されています。

もう1つの例として、foo2firstsecond という名前で2つの整数フィールドを持つレコード変数であるとしてみましょう。すると次のコードは、整数 1 と 2 を foo2 の2つのフィールドに割り当てます:

extvar "foo2.first" = 1 extvar "foo2.second" = 2

ことがことだけに、extvar 宣言の機能は本質的に安全ではなく、慎重に使う必要があります。

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