外部プログラム内からWolframシステムを呼び出す
外部プログラム内からWolframシステムを呼び出すためにはWSTP (Wolfram Symbolic Transfer Protocol)の一般的な多くの機能を利用する必要がある.まず最初は,WolframシステムとのWSTP接続を確立することである.
Wolfram言語から呼出し可能な外部プログラムを作成するのにWSTPテンプレートを利用した場合は,WSTP接続を確立するためのソースコードが自動的に作成され,外部プログラムは単にWSMain(argc,argv)を呼び出すだけでよい.しかし,一般に,WSTP接続を確立するには関数を何個か呼び出す必要がある.
WSENV WSInitialize(0) | WSTPライブラリ関数を初期化する |
WSLINK WSOpenArgcArgv(WSENV env,int argc,char**argv,int*errno) | |
argv 配列からパラメータを取って,WSTP接続を開く | |
WSLINK WSOpenString(WSENV env,char*string,int*errno) | |
文字列1つからパラメータを取って,WSTP接続を開く | |
int WSActivate(WSLINK link) | WSTP接続を活性化し,他端のプログラムが応答するのを待つ |
void WSClose(WSLINK link) | WSTP接続を閉じる |
void WSDeinitialize(WSENV env) | WSTPライブラリ関数を終了する |
#include "wstp.h"
int main(int argc, char *argv[]) {
WSENV env;
WSLINK link;
int errno;
env = WSInitialize(0);
link = WSOpenArgcArgv(env, argc, argv, &errno);
WSActivate(link);
...
}
"-linklaunch" | LinkLaunch["name"]のように作用する |
"-linkcreate" | LinkCreate["name"]のように作用する |
"-linkconnect" | LinkConnect["name"]のように作用する |
"-linkname","name" | 使用する名前を与える |
"-linkprotocol","protocol" | 使用するリンクプロトコル((TCPIP,Pipes等)を与える |
int WSEndPacket(WSLINK link) | パケットの最後を示す |
int WSNextPacket(WSLINK link) | 次のパケットの頭部を見付ける |
int WSNewPacket(WSLINK link) | 現行のパケットの最後までスキップする |
関数WSNextPacket()はカーネルからくる次のパケットの頭部を見付け,パケットの種類を表す定数を返す.
Wolfram言語パケット |
定数
| |
ReturnPacket[expr] | RETURNPKT | 計算の結果 |
ReturnTextPacket["string"] | RETURNTEXTPKT | 結果のテキスト形式 |
InputNamePacket["name"] | INPUTNAMEPKT | 入力行の名前 |
OutputNamePacket["name"] | OUTPUTNAMEPKT | 出力行の名前 |
TextPacket["string"] | TEXTPKT | Printのような関数が出したテキスト出力 |
MessagePacket[symb,"tag"] | MESSAGEPKT | Wolfram言語が生成したメッセージ |
InputPacket["prompt"] | INPUTPKT | Input関数への応答を要求する |
CallPacket[i,list] | CALLPKT | 外部関数の呼出しを要求する |
WSNextPacket()が認識するパケットの一部
エラーが発生するか,ReturnPacketが見付かるまで,リンクからデータを読み続ける:
while ((p = WSNextPacket(link)) && p != RETURNPKT)
WSNewPacket(link);
Wolframシステムの完全なフロントエンドを書く場合は,カーネルが生成するあらゆる種類のパケットを処理する必要がある.WSNextPacket()が返す値に応じて適当にswitchを書けば問題ない.
int WSReady(WSLINK link) | リンク上に読出しを待っているデータがあるかどうかをチェックする |
int WSReadyParallel (WSENV e, WSLINK *links, int n, mltimeval t) | |
リンクのリストから読み込まれるデータがあるかどうかを並列にテストする | |
int WSFlush(WSLINK link) | リンクに書き出されるのを待っているデータを保持するバッファをフラッシュする |
フロントエンドのような,より洗練された外部プログラムでは,Wolframシステムが送ってくるデータを待つ間でも,何等かのオペレーションを実行する必要がある場合もある.WSNextPacket()のような標準WSTPライブラリ関数を呼び出すと,プログラムはその関数が必要とするすべてのデータが得られるまで実行をブロックしてしまう.
WSReady()を繰り返し呼び,WSReady()が0を返さなくなった時点でWSNextPacket()のような関数を呼ぶようにすれば,ブロックするのを避けることができる.WSReady()はWolfram言語関数LinkReadyQと類似の関数である.