Hatena::ブログ(Diary)

新言語 Xtalを作る日記

2010-01-21

標準ライブラリのバインド 12:35  標準ライブラリのバインドを含むブックマーク

たとえばluaでは、数学系の関数luaから使いたいという場合、

lua_State *L = lua_open();
luaopen_math(L);

というように、luaopen_math()を呼ぶ必要があります。これはsquirrelでもそうだったはずです。

使わないライブラリでメモリを圧迫しないようにできるわけですが、ちょっと面倒にも思います。

Xtalでは必要なときに自動的にバインドされる機構を入れました。

f: math::sin(1); // ここでmathのメンバがバインドされる

Xtalでは、使わないときはバインドされないし、使う際は何もC++側をいじることなく使うことができるわけです。


これは、ユーザーが作ったライブラリも同様です。


XTAL_PREBIND(UserClass){ // PREBINDでは、コンストラクタ、継承関係を記述
  it->inherit(cpp_class<UserBaseClass>()); // UserBaseClassを継承させる
  it->def_ctor(ctor<UserClass>()); // コンストラクタを登録
}

XTAL_BIND(UserClass){ // メンバを登録
  it->def_method("aaa", &UserClass::aaa);
  it->def_method("bbb", &UserClass::bbb)
  it->def_method("ccc", &UserClass::ccc)
  it->def_method("ddd", &UserClass::ddd)
  it->def_method("eee", &UserClass::eee)
  it->def_method("fff", &UserClass::fff)
}

と書いておけば、クラスのメソッドを呼び出すときなどに自動的にXTAL_BINDが実行され、メンバが登録されます。

XTAL_PREBINDは継承関係のチェックがなされる際、またはインスタンスの生成がされる際に呼び出されます。