C++ インターフェース

この節では、ホスト言語とゲスト言語の連絡のために用いられる、ホスト言語側のクラスを規定する。ホスト言語では、ゲスト言語とのインターフェースのために、以下のクラスが用意されている。

pastelstitch::StaticEnvironment クラス

pastelstitch::StaticEnvironment クラスは、パステルステッチの静的環境である。パステルステッチのインタープリターを動作させるには、まず、StaticEnvironment クラスのインスタンスをデフォルトコンストラクターで生成する。続いて、そのインスタンスに対して以下のメンバー関数を実行する。

pastelstitch::StaticEnvironment クラスは以下のメンバー関数を持つ。

void load (tinyxml2::XMLDocument &document)

pastelstitch::StaticEnvironment クラスの load メンバー関数は、パステルステッチのオブジェクトコードを読み取る。document 引数は TinyXML-2 の XMLDocument クラスである。実装によっては他の XML パーサーを用いる。pastelstitch::StaticEnvironment の 1 個のインスタンスに対して load メンバー関数を複数回実行することができる。そのときは、複数のオブジェクトコードを順に結合したかのようなプログラムが得られる。

void initialize ()

pastelstitch::StaticEnvironment クラスの initialize メンバー関数は、パステルステッチのインタープリターがイニシャライズ実行を行う。実行位置がプログラムの終端に達するか、halt 制御構文が実行されると、このメンバー関数は終了する。

注意 pastelstitch::StaticEnvironment クラスの load メンバー関数を実行してから、run メンバー関数を実行するまでの間に、この initialize メンバー関数を実行する必要がある。

void run ()

pastelstitch::StaticEnvironment クラスの run メンバー関数は、パステルステッチのインタープリターが本体実行を行う。実行位置がプログラムの終端に達するか、halt 制御構文が実行されると、このメンバー関数は終了する。

void run (const std::map <std::string, std::shared_ptr <pastelstitch::Value>> &continuation_arguments, std::map <std::string, std::shared_ptr <pastelstitch::Value>> &halt_arguments)

pastelstitch::StaticEnvironment クラスの run メンバー関数の 2 引数のオーバーロードは、本体実行を行う。continuation_arguments 引数は引数の名前と値のマップである。これらの引数はゲスト言語からコンティニュエーション変数で参照できる。halt_arguments 引数はゲスト言語の halt 制御構文の引数の名前と値のマップである。

void add_primitive_operation (pastelstitch::CompoundVector address, std::shared_ptr <pastelstitch::PrimitiveOperation> primitive_operation)

pastelstitch::StaticEnvironment クラスの add_primitive_operation メンバー関数は、プリミティブ演算を登録する。address 引数のベクトルでアドレスを指定する。primitive_operation 引数は、pastelstitch::PrimitiveOperation クラスの派生クラスのインスタンスへの共有ポインターである。

std::shared_ptr <pastelstitch::CapsuleValue> hold_capsule (std::shared_ptr <Capsule> capsule)

pastelstitch::StaticEnvironment クラスの hold_capsule メンバー関数は、カプセルの実体 capsule を受け取り、カプセル型の値を返す。カプセルの寿命の管理は静的環境が行うので、カプセル型の値を生成するには、このメンバー関数を使用する必要がある。

pastelstitch::PrimitiveOperation クラス

pastelstitch::PrimitiveOperation クラスは、パステルステッチのプリミティブ演算である。PrimitiveOperation クラスは抽象クラスであり、operator () メンバー関数が純粋バーチャル関数になっている。プリミティブ演算を作成するには、PrimitiveOperation クラスの派生クラスと、その派生クラスの operator () メンバー関数を定義する必要がある。さらに、プリミティブ演算を登録するには、PrimitiveOperation クラスの派生クラスのインスタンスを作成し、静的環境 (pastelstitch::StaticEnvironment クラス) の add_primitive_operation メンバー関数で登録する。

pastelstitch::PrimitiveOperation クラスには以下のメンバー関数がある。これらのメンバー関数は operator () 関数で使用できる。

pastelstitch::DynamicEnvironment *get_dynamic_environment () const

pastelstitch::PrimitiveOperation クラスの get_dynamic_environment メンバー関数は、実行中の動的環境を得る。得られたポインターを解放してはいけない。

pastelstitch::StaticEnvironment *get_static_environment () const

pastelstitch::PrimitiveOperation クラスの get_static_environment メンバー関数は、実行中の静的環境を得る。得られたポインターを解放してはいけない。

std::shared_ptr <pastelstitch::Value> get_argument (std::string label = std::string ("main")) cons

pastelstitch::PrimitiveOperation クラスの get_argument メンバー関数は、プリミティブ演算の引数の値を得る。label 引数を省略すると main 引数の値を得る。得られた値を書き換えてはいけない。そのまま他のメンバー関数 (set_return_value) に渡すか、pastelstitch::Value クラスの新たなインスタンスを作成して、それを使用すること。

void set_return_value (std::shared_ptr <pastelstitch::Value> value)

pastelstitch::PrimitiveOperation クラスの set_return_value メンバー関数は、プリミティブ演算の戻り値を指定する。このメンバー関数を実行せずに operator () メンバー関数を終了したときは、戻り値はブーリアン型の false になる。

void set_continuation (std::shared_ptr <pastelstitch::Value> continuation, const std::map <std::string, std::shared_ptr <pastelstitch::Value>> &continuation_arguments)

pastelstitch::PrimitiveOperation クラスの set_continuation メンバー関数は、continuation 引数で指定された値がコンティニュエーション型であれば、プリミティブ演算の実行 (pastelstitch::PrimitiveOperation::operator () メンバー関数) が終了したあと、コンティニュエーションを実行する。continuation_arguments 引数は引数の名前と値のマップである。これらの引数はゲスト言語からコンティニュエーション変数で参照できる。

throw_exception () const

pastelstitch::PrimitiveOperation クラスの throw_exception メンバー関数は、ホスト言語の例外を投げる。

primitive_assert (bool a_condition) const

pastelstitch::PrimitiveOperation クラスの primitive_assert メンバー関数は、引数が false であれば、ホスト言語の例外を投げる。

pastelstitch::Capsule クラス

pastelstitch::Capsule クラスは、カプセルの実体である。カプセルを作成するには、Capsule クラスの派生クラスを宣言し、その派生クラスの operator () メンバー関数の実体を定義する必要がある。さらに、カプセル型の値を生成するには、Capsule クラスの派生クラスのインスタンスを作成し、静的環境 (pastelstitch::StaticEnvironment クラス) のメンバー関数 hold_capsule で生成する。

pastelstitch::Capsule クラスには以下のメンバー関数がある。これらのメンバー関数は operator () 関数で使用できる。

これらのメンバー関数の機能は、プリミティブ演算 (pastelstitch::PrimitiveOperation クラス) の同名のメンバー関数と同じである。

pastelstitch::Value クラス

pastelstitch::Value クラスはパステルステッチの値である。パステルステッチの値に新たなプリミティブな型を追加するには、pastelstitch::Value クラスの派生クラスを定義する。pastelstitch::Value クラスは以下のメンバー関数を持つ。

このうち type は純粋バーチャルメンバー関数なので、派生クラスでこのメンバー関数を定義する必要がある。他のメンバー関数は、pastelstitch::Value クラスで定義されている動作が不適であるときのみ、派生クラスで定義すればよい。また、これらのメンバー関数と名前が同じで意味が異なるメンバー関数を、派生クラスで定義してはいけない。

また、以下の関数は pastelstitch::Value クラスのインスタンスを生成して返す。

bool type (pastelstitch::CompoundVector a_vector) const

pastelstitch::Value クラスの type メンバー関数は、型の名前であるベクトルを引数に取り、その型に合致するかどうかを返す。このメンバー関数は ^type 演算子で使用される。このメンバー関数は純粋バーチャルメンバー関数なので、派生クラスで必ず定義する必要がある。

std::string format () const

pastelstitch::Value クラスの format メンバー関数は、値を文字列に変換したものを返す。print プリミティブ演算では、この文字列が表示される。また、値を文字列型に変換したとき、この文字列が使われる。この文字列から元の値が復元できるようにする必要はない。このメンバー関数を派生クラスで定義しなければ、空文字列を返す。

bool is_true () const

pastelstitch::Value クラスの is_true メンバー関数は、この値が真偽値の「真」と解釈されるかどうかを返す。このメンバー関数を派生クラスで定義しなければ true を返す。このメンバー関数を派生クラスで定義するべきではない。

bool is_boolean () const

pastelstitch::Value クラスの is_boolean メンバー関数は、この値がブーリアンであるかどうかを返す。このメンバー関数を派生クラスで定義しなければ false を返す。このメンバー関数を派生クラスで定義するべきではない。

bool is_natural_number () const

pastelstitch::Value クラスの is_natural_number メンバー関数は、この値が自然数であるかどうかを返す。このメンバー関数を派生クラスで定義しなければ false を返す。このメンバー関数を派生クラスで定義するべきではない。

bool is_vector () const

pastelstitch::Value クラスの is_vector メンバー関数は、この値がベクトルであるかどうかを返す。このメンバー関数を派生クラスで定義しなければ false を返す。このメンバー関数を派生クラスで定義するべきではない。

bool is_string () const

pastelstitch::Value クラスの is_string メンバー関数は、この値が文字列であるかどうかを返す。このメンバー関数を派生クラスで定義しなければ false を返す。このメンバー関数を派生クラスで定義するべきではない。

bool is_floating_point_number () const

pastelstitch::Value クラスの is_floating_point_number メンバー関数は、この値が浮動小数点数であるかどうかを返す。このメンバー関数を派生クラスで定義しなければ false を返す。このメンバー関数を派生クラスで定義するべきではない。

bool is_continuation () const

pastelstitch::Value クラスの is_continuation メンバー関数は、この値がコンティニュエーションであるかどうかを返す。このメンバー関数を派生クラスで定義しなければ false を返す。このメンバー関数を派生クラスで定義するべきではない。

bool is_capsule () const

pastelstitch::Value クラスの is_capsule メンバー関数は、この値がカプセルまたはカプセル識別子であるかどうかを返す。このメンバー関数を派生クラスで定義しなければ false を返す。このメンバー関数を派生クラスで定義するべきではない。

void get (bool &a_value) const

pastelstitch::Value クラスの get メンバー関数が bool 型の引数を持つとき、この値を bool 型に変換して返す。このメンバー関数を派生クラスで定義しなければ true を返す。このメンバー関数を派生クラスで定義するべきではない。

void get (unsigned int &a_value) const

pastelstitch::Value クラスの get メンバー関数が unsigned int 型の引数を持つとき、この値が自然数であれば、unsigned int 型に変換して返す。このメンバー関数を派生クラスで定義するべきではない。

void get (pastelstitch::CompoundVector &a_value) const

pastelstitch::Value クラスの get メンバー関数が CompoundVector 型の引数を持つとき、この値がベクトルであれば、CompoundVector 型に変換して返す。このメンバー関数を派生クラスで定義するべきではない。

void get (std::string &a_value) const

pastelstitch::Value クラスの get メンバー関数が string 型の引数を持つとき、この値が文字列であれば、string 型に変換して返す。このメンバー関数を派生クラスで定義するべきではない。

void get (double &a_value) const

pastelstitch::Value クラスの get メンバー関数が double 型の引数を持つとき、この値が浮動小数点数であれば、double 型に変換して返す。このメンバー関数を派生クラスで定義するべきではない。

void run (const std::map <std::string, std::shared_ptr <pastelstitch::Value>> &continuation_arguments, std::map <std::string, std::shared_ptr <pastelstitch::Value>> &halt_arguments) const

pastelstitch::Value クラスの run メンバー関数は、この値がコンティニュエーションであれば、そのコンティニュエーションを実行する。continuation_arguments 引数は引数の名前と値のマップである。これらの引数はゲスト言語からコンティニュエーション変数で参照できる。halt_arguments 引数はゲスト言語の halt 制御構文の引数の名前と値のマップである。このメンバー関数を派生クラスで定義するべきではない。

void get (std::shared_ptr <pastelstitch::Capsule> &a_value) const

pastelstitch::Value クラスの get メンバー関数が Capsule のスマートポインター型の引数を持つとき、この値がカプセルまたはカプセル識別子であれば、 Capsule のスマートポインター型に変換して返す。このメンバー関数を派生クラスで定義するべきではない。

std::shared_ptr <pastelstitch::Value> make_value (bool a_value)

pastelstitch::make_value 関数が bool 型の引数を持つとき、ブーリアン型の値を返す。

std::shared_ptr <pastelstitch::Value> make_value (unsigned int a_value)

pastelstitch::make_value 関数が unsigned int 型の引数を持つとき、自然数型の値を返す。

std::shared_ptr <pastelstitch::Value> make_value (pastelstitch::CompoundVector a_value)

pastelstitch::make_value 関数が CompoundVector 型の引数を持つとき、ベクトル型の値を返す。

std::shared_ptr <pastelstitch::Value> make_value (std::string a_personal, std::string a_family)

pastelstitch::make_value 関数が 2 個の string 型の引数を持つとき、これらの文字列をそれぞれ固有名と姓とする有名ベクトルを作り、ベクトル型の値を返す。

std::shared_ptr <pastelstitch::Value> make_value (std::string a_value)

pastelstitch::make_value 関数が 1 個の string 型の引数を持つとき、文字列型の値を返す。

std::shared_ptr <pastelstitch::Value> make_value (double a_value)

pastelstitch::make_value 関数が double 型の引数を持つとき、浮動小数点数型の値を返す。

std::shared_ptr <pastelstitch::Value> make_value (std::shared_ptr <pastelstitch::Capsule> a_capsule, pastelstitch::StaticEnvironment *a_senv)

pastelstitch::make_value 関数が Capsule のスマートポインター型と StaticEnvironment のポインター型の引数を持つとき、カプセル型の値を返す。カプセルの寿命の管理は静的環境が行うので、カプセル型の値を生成するには、静的環境のポインターが必要である。