外部プログラムとの双方向通信

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