外部プログラムとの双方向通信
Installを使ってWolfram Symbolic Transfer Protocol (WSTP)適合プログラムをインストールする場合,そのプログラムの振舞いはやや単純化されたWolfram言語カーネルと似ている.外部プログラム中の関数を呼び出すときは必ずCallPacketがプログラムに送られ,プログラムは呼び出された関数の結果をReturnPacketで包み込んで返送する.
外部プログラムをインストールする.プログラムとの接続に用いられるLinkObjectが返される:
CallPacketに対する外部プログラムの応答:
$CurrentLink | 現在実行中の外部プログラムとのWSTP接続 |
:Begin:
:Function: addto
:Pattern: addto[$CurrentLink, n_Integer]
:Arguments: {n}
:ArgumentTypes: {Integer}
:ReturnType: Integer
:End:
int counter = 0;
int addto(int n) {
counter += n;
return counter;
}
外部プログラムにその状態を管理させて,異なる状態の異なるインスタンスを利用することもできる.$CurrentLinkはプログラムのそれぞれのインスタンスを示している.
$CurrentLinkの値は,プログラムが最初にインストールされるときと同様,プログラムのインスタンスが呼ばれるたびに一時的に設定される.
WSEvaluateString(stdlink,"string") | Wolframシステムに入力を送信するが,戻り値を戻さない |
最も簡単に説明すると,WSTP関数WSEvaluateString()で文字列をWolframシステムに送信することができる.Wolframシステムはその文字列を評価し,文字列が指定する作用を生成するが,その評価の結果は外部関数へは戻らない.
EvaluatePacketを開始する:
WSPutFunction(stdlink, "EvaluatePacket", 1);
WSPutFunction(stdlink, "Factorial", 1);
WSPutInteger32(stdlink, 7);
WSEndPacket(stdlink);
ReturnPacketが返っていることをチェック:
WSCheckFunction(stdlink, "ReturnPacket", &n);
WSGetInteger32(stdlink, &ans);
WSEndPacket(stdlink) | パケットが終了,Wolframシステムへの送信が可能なことを示す |
EvaluatePacket[input]をWolframシステムに送信すると,それに対して一般にたくさんのパケットが生成されるが,最後のパケットはReturnPacket[output]になる.前もって構造を知ることのできないパケットや式の列を扱う方法については「外部プログラム中で式を処理する」で解説する.