XTAL_PREBIND(ClassName);
Xtal環境にC++クラスの継承構造やコンストラクタをバインドします。このマクロでバインドしただけではXtalから使うことは出来ず、filelocalやglobal、libといった領域にcpp_class<T>を使ってクラスオブジェクトを定義する必要があります。
実際に内容が実行されるタイミングはXtalの初期化時です。
Xtalに渡すクラスは全てこれを使って登録する必要があり、そうしないと予期せぬ動作をして落ちたりします。
class Foo{ public: Foo(){ StringPtr("foo constructed")->p(); } void print(){ StringPtr("foo")->p(); } }; XTAL_PREBIND(Foo){ Xdef_ctor0(); } void exec_xtal(){ xtal::global()->def(Xid(Foo), xtal::cpp_class<Foo>()); Xsrc(( foo : Foo(); foo.p; ))->call(); }
foo constructed <(instance of lib::builtin::global::Foo)>
実装詳細に依存している注意点ですが、同じクラスの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処理系に登録している関係で、このような仕様となっています。