[2] 組み込み関数インタフェース
データベースのフロントエンドをするインタプリタには、データベース操作を行う固有の関数を組み込まなければならない。その組み込み関数はCで記述し、インタプリタのコードとリンクする。
まず以下のように、関数を定義する。
XLtype * pEmbeddedFunction(XLenv * e, XLtype * s) { s に関する処理。 return 結果 }
sは、List ( 引数0,引数1,引数2,....)という形を取っている。それぞれの引数は、以下に示す、cLambdaにおけるオプションがApplicativeであれば、評価されてから渡される。
次に、インタプリタの初期の環境生成時に上記関数を環境に登録するコードを追加する。
XLenv * RootEnv;
main()
{
Env0 = cNewEnvironment(0);
....
cDefine(Env0,"EnbeddedFunction",
cLambda( // 関数を得る。
"Applicative", // 関数の属性
0, // 引数評価のための環境
pEmbeddedFunction)); // 呼び出される関数名
....
}
以下に述べるプリミティブは、インタプリタのソースコード内では、
XLtype *
_プリミティブ名(XLenv * e,XLtype * s)
{
}
という形で定義されている。新たなるプリミティブを定義するときにこの関数を使うことが出来る。
また、このプリミティブをそのまま使うには、引数がsで示される構造型にすべてまとめられており、使いにくく、また、カレント環境を参照しない演算関数などでも、eが定義されている。従って、プリミティブを新たにコーディングするために使いやすく引数を整理した関数として、以下のような関数を定義している。
XLtype *
cプリミティブ名(....)
{
}
上述main関数の例のなかで定義しているcDefine,cLambdaはこの関数である。引数の評価はEvalが行うので、_プリミティブ名、および、cプリミティブ名、のいずれの形式に置いても、引数の評価はされないことに注意しなければならない。
XLtype は、XLにおける基本型、構造型の内部形式であり、XLenvは環境の内部形式である。この実際の定義は別途インタプリタのソースコードのヘッダファイルにて明らかにする。
▲