読者です 読者をやめる 読者になる 読者になる

consttable

consttableの存在がよくわからんかったのでここにメモしておきます。

enum hoge {
  one=1,
  two=2,
  san=3,
};
const uuu=11;

このenumとconstはroottableやregistrytableと並列に存在するconsttableへスクリプトコンパイル時に蓄えられます。ここでわからないのがclassローカルの定数値。そもそもconsttableはVM空間の中に1つしかないのでここに定数を代入するわけではないみたいです。
ではどうするか?sq.exeを使ってスクリプトをどうかくとどうなるのか調べてみました。

class aaa {
  //const uuu=11;//コンパイルエラー:consttableがグローバル空間にしか存在しないから
  static vvv=33;
  xxx=55;
};
local a=aaa();//instanceを作成。この時点でclass変更不可。

//class→instanceへの伝播
print(aaa.vvv+"\n");//33
print(aaa.xxx+"\n");//55
print(a.vvv+"\n");//33
print(a.xxx+"\n");//55

//書き換えてみる
//aaa.vvv=0;//ランタイムエラー:classが変更不可だから
//aaa.xxx=0;//ランタイムエラー:classが変更不可だから
//a.vvv=0;//ランタイムエラー:classへの委譲だから?(自信ない^^)
a.xxx=0;//変更可能

print(aaa.vvv+"\n");//33
print(aaa.xxx+"\n");//55
print(a.vvv+"\n");//33
print(a.xxx+"\n");//0

この結果からclass内はstaticをつけておけばclassの中身への委譲になり、classはinstance生成された時点で変更不可なので変更できず、C++の"static const"のような扱いになるみたいです。
それにしてもconsttableについての情報が少ないのはなんでなんだろう?英語フォーラムを億劫にならずに読むしかないか。
ついでに気づいたこと。
enumやclassもclassの中には書けないみたい。マニュアルに書けるなんて一言も書いてないのでまぁ当然といえば当然ですが(^^;そもそもenumはconsttableに配置されるものなので当然ですね。class内enumを仮想的に実装するには、

class hoge_t {
  static one=1;
  static two=2;
  static san=3;
};
class foo {
  static hoge=hoge_t;
};
delete hoge_t;

これをC++からやってやればもっとシンプルに作れる。foo.hogeインスタンスが作れてしまうけど、_get+freevarでごにょごにょやるよりかはスマートだろうか。