// まず,第一引数が machine クラス,残りが FSP,返り値が bool の
// 関数を実装します.
bool add(machine& m, FSP arg1, FSP arg2, FSP arg3 )
{
// ここ以下では,FSP クラス (structur.{h,cpp} で定義されている)
// のインスタンスである arg1, arg2, ... を使って,述語の引数に
// アクセスします.
// まず,エラーチェックをします.ここでは,arg1, arg2 は integer
// でなければならないので,そのチェックを行います.
// 素性構造の処理のためのいろいろなメソッドは FSP クラスで
// 提供されています.
if ( ! arg1.IsInteger() || ! arg2.IsInteger() ) {
// どちらかが integer で無い場合は,メッセージを表示します.
// RUNWARN はランタイムワーニングのメッセージを表示するマクロです.
RUNWARN( "Arguments of 'add/3' must be integers" );
// 組み込み述語を fail させるには,false を返します.
return false;
}
// 引数の素性構造を C++ の int 型に変換します.
int X = arg1.ReadInteger();
int Y = arg2.ReadInteger();
// Z = X + Y を計算します.
int Z = X + Y;
// 結果の整数を素性構造に変換します.
FSP result = FSP( m, Z );
// 結果の素性構造を第3引数と単一化します.
// 単一化が成功すれば true, 失敗すると false が返ってきます.
if ( ! arg3.Unify( result ) ) {
// 単一化が失敗した場合は,この組み込み述語も失敗させます.
return false;
}
// 組み込み述語の実行が成功した場合は,true を返します.
return true;
}
// この関数を lilfes の組み込み述語として登録する場合は,
// LILFES_BUILTIN_PRED_X というマクロを使います.X は述語の
// 引数の数です.第一引数は C++ の関数名,第二引数は lilfes
// での述語名です.
LILFES_BUILTIN_PRED_3(add, add);
|