====== XTAL_BIND ======
XTAL_BIND(ClassName);
C++クラスのメンバをバインドします。
内容が呼び出されるのはバインドされたクラスがXtalスクリプトによって生成されるときです。下の例で言えば
> foo : Foo();
の部分ですね。
===== Example =====
==== C++ ====
class Foo{
public:
Foo(){
StringPtr("foo constructed")->p();
}
void print(){
StringPtr("foo")->p();
}
};
XTAL_PREBIND(Foo){
Xdef_ctor0();
}
XTAL_BIND(Foo){
Xdef_method(print);
}
void exec_xtal(){
xtal::global()->def(Xid(Foo), xtal::cpp_class());
Xsrc((
foo : Foo();
foo.p;
foo.print;
))->call();
}
==== Output ====
foo constructed
<(instance of lib::builtin::global::Foo)>
foo
===== Notice =====
実装詳細に依存している注意点ですが、同じクラスのXTAL_PREBINDとXTAL_BINDは ** 同一翻訳単位上で順番に**、かつ、**混在無しに**書く必要があります。
つまり、
// foo.hpp
class Foo{};
// bar.hpp
class Bar{};
が存在し、FooとBarをバインドしたい場合には、
XTAL_PREBIND(Foo){}
XTAL_BIND(Foo){}
XTAL_PREBIND(Bar){}
XTAL_BIND(Bar){}
という順番を崩さずそれぞれ連続して書く必要があります。
XTAL_[PRE]BINDの中身をグローバル静的変数の構築を使って起動時にXtal処理系に登録している関係で、このような仕様となっています。