外部プログラム中で式を処理する

Wolfram言語の式はすべての種類のデータを扱うことができる,非常に一般的な方法を提供しているが,その式を外部プログラム中で利用したいこともあるだろう.しかし,Cのような言語は通常のWolfram言語の式を保持する直接的な方法がないが,Wolfram Symbolic Transfer Protocol (WSTP)ライブラリが提供するループバックリンクを利用すれば可能になる.ループバックリンクとは外部プログラム内部のローカルなWSTP接続で,そのリンクに式を書き込んで,あとでその式を読み戻すことが可能である.
WSLINKWSLoopbackOpen(stdenv,int*errno)
ループバックリンクを開く
voidWSClose(WSLINK link)
リンクを閉じる
intWSTransferExpression(WSLINK dest,WSLINK src)
src から得た式を dest に置く
ループバックリンク関数
ループバックリンクを開く:
...
wstp = WSLoopbackOpen(stdenv, &errno);
Power[x,3]をリンクに置く:
WSPutFunction(wstp, "Power", 2);
WSPutSymbol(wstp, "x");
WSPutInteger32(wstp, 3);
...
ループバックリンクから式を取り出す:
WSGetFunction(wstp, &head, &n);
WSGetSymbol(wstp, &sname);
WSGetInteger32(wstp, &k);
...
ループバックリンクを再度閉じる:
WSClose(wstp);
WSTransferExpression()を使ってWolfram言語からstdlinkを経由して式を取り出すことができる.取り出した式はループバックリンクに保存し,後で処理することもできる.
WSTransferExpression()はまた,ループバックリンクにためておいた式を取り出し,それをstdlink経由でWolfram言語に転送することもできる.
21!をループバックリンクに置く:
...
WSPutFunction(wstp, "Factorial", 1);
WSPutInteger32(wstp, 21);
頭部FactorIntegerをWolfram言語に送信する:
WSPutFunction(stdlink, "FactorInteger", 1);
ループバックリンクにある21!stdlinkに転送する:
WSTransferExpression(stdlink, wstp);
ループバックリンクにはあらゆる式の列を置くことができる.式を置いた順番と式を取り出す順番は通常,同じになる.
普通は取り出した式はリンク上には残っていない.しかし,WSCreateMark()を使えば,リンク上の式のシーケンスの特定の位置にマークすることができる.WSTPが式を保存するときはいつもそのマークの後ろに保存させることができ,それを後で取り出すことができる.
WSMARKWSCreateMark(WSLINK link)
リンク上の式のシーケンスの現在地にマークを付ける
WSSeekMark(WSLINK link,WSMARK mark,int n)
リンク上の特定のマークから n 式後ろに移動する
WSDestroyMark(WSLINK link,WSMARK mark)
リンク上のマークを破壊する
WSTPリンクにマークする
整数45をループバックリンクに置く:
...
WSPutInteger32(wstp, 45);
33をリンクに置く:
WSPutInteger32(wstp, 33);
76をリンクに置く:
WSPutInteger32(wstp, 76);
リンクから45を読み出す.45はリンク上には残っていない:
WSGetInteger32(wstp, &i);
リンク上の現在地をマークする:
mark = WSCreateMark(wstp);
33が読み出される:
WSGetInteger32(wstp, &i);
76が読み出される:
WSGetInteger32(wstp, &i);
マークの位置に戻る:
WSSeekMark(wstp, mark, 0);
33が再び読み出される:
WSGetInteger32(wstp, &i);
マークは利用が済んだら破壊する.不必要な式は残っていない:
WSDestroyMark(wstp, mark);
WSTPライブラリは,ループバックリンクの開閉が非常に効果的に行えるように実装されている.ひとつだけ頭に入れておくべきことは,あるリンク上にマークを生成すると,WSTPは,マークが破壊されるまで,その後リンクに置かれる式を記憶することである.
intWSGetNext(WSLINK link)
リンク上の次のオブジェクトのタイプを見付ける
intWSGetArgCount(WSLINK link,int*n)
リンク上の関数の取る引数の個数を n に保管する
intWSGetSymbol(WSLINK link,char**name)
シンボル名を取得する
intWSGetInteger32(WSLINK link,int*i)
機械サイズの整数を取得する
intWSGetReal64(WSLINK link,double*x)
機械サイズの浮動小数点数を取得する
intWSGetString(WSLINK link,char**string)
文字列を取得する
リンクから式の一部を取得する関数
WSTKFUNC
合成関数:頭部と引数
WSTKSYM
Wolfram言語のシンボル
WSTKINT
整数
WSTKREAL
浮動小数点数
WSTKSTR
文字列
WSGetNext()が返す定数
switch(WSGetNext(wstp)) {
合成関数を読み込む:
    case WSTKFUNC:
WSGetArgCount(wstp, &n);
recurse for head
for (i = 0; i < n; i++) {
recurse for each argument
}
シンボルを読み込む:
    case WSTKSYM:
WSGetSymbol(wstp, &name);
機械サイズの整数を読み込む:
    case WSTKINT:
WSGetInteger32(wstp, &i);

}
WSGetNext()を使うことで,あらゆる式を読み込むプログラムを書くことは簡単になる.WSTPの動作に従い,関数の頭部と引数とは,リンク上の連続した式として現れ,それらを1個ずつ読み込むことができる.
関数の頭部がシンボルであることが分かったら,WSGetNext()の代りにWSGetFunction()を使うことができる.しかし,この場合,そのシンボル名を保持するために使ったメモリをWSReleaseSymbol()を呼び出して解放することを忘れないこと.
intWSPutNext(WSLINK link,int type)
指定した型のオブジェクトをリンクへ置く準備をする
intWSPutArgCount(WSLINK link,int n)
合成関数の引数の個数を与える
intWSPutSymbol(WSLINK link,char*name)
リンクにシンボル名を置く
intWSPutInteger32(WSLINK link,int i)
リンクに機械サイズの整数を置く
intWSPutReal64(WSLINK link,double x)
リンクに機械サイズの浮動小数点数を置く
intWSPutString(WSLINK link,char*string)
リンクに文字列を置く
リンクに式の一部を置く関数
WSGetNext()の場合と同じように,WSPutNext()の指定ではヘッダファイルwstp.hに定義してあるWSTKFUNC等のデフォルトの識別子を使い式の型の指定を行う.