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

Installを使ってWolfram Symbolic Transfer Protocol (WSTP)適合プログラムをインストールする場合,そのプログラムの振舞いはやや単純化されたWolfram言語カーネルと似ている.外部プログラム中の関数を呼び出すときは必ずCallPacketがプログラムに送られ,プログラムは呼び出された関数の結果をReturnPacketで包み込んで返送する.

外部プログラムをインストールする.プログラムとの接続に用いられるLinkObjectが返される.
In[1]:=
Click for copyable input
Out[1]=
関数CallPacketを外部プログラムに送信する.
LinkWriteを使い呼出し用パケット(CallPacket)を送ることも可能である.CallPacketの第1引数は外部プログラムにあるどの関数を呼び出すかを指定する.
In[3]:=
Click for copyable input
CallPacketに対する外部プログラムの応答.
In[4]:=
Click for copyable input
Out[4]=

外部プログラム1個に対して複数のInstallを実行すると,Wolframシステムはそのプログラムと複数のWSTP接続を開く.それぞれの接続は独立したLinkObjectとして働く.

$CurrentLink現在実行中の外部プログラムとのWSTP接続

外部プログラムの異なるインスタンスを特定する

:Begin:
:Function: addto
$CurrentLinkの引数にする.
:Pattern:       addto[$CurrentLink, n_Integer]
:Arguments:     n
:ArgumentTypes: Integer
:ReturnType: Integer
:End:
プログラムの開始時に大域変数のをゼロに設定する.
int counter = 0;
int addto(int n) 
counter += n;
return counter;
を含んでいる外部プログラムのインスタンスをインストールする.
In[5]:=
Click for copyable input
Out[5]=
別のインスタンスをインストールする.
In[6]:=
Click for copyable input
Out[6]=
外部プログラムの最初のインスタンスのcounterに10を足す.
In[7]:=
Click for copyable input
Out[7]=
外部プログラムの2番目のインスタンスのcounterに15を足す.
In[8]:=
Click for copyable input
Out[8]=
プログラムの最初のインスタンスに再び働きかける.
In[9]:=
Click for copyable input
Out[9]=

外部プログラムにその状態を管理させて,異なる状態の異なるインスタンスを利用することもできる.$CurrentLinkはプログラムのそれぞれのインスタンスを示している.

$CurrentLinkの値は,プログラムが最初にインストールされるときと同様,プログラムのインスタンスが呼ばれるたびに一時的に設定される.

WSEvaluateString(stdlink,"string")Wolframシステムに入力を送信するが,戻り値を戻さない

Wolframシステムが評価すべき文字列を送信する

WSTP接続の双方向性は,Wolframシステムに外部プログラムの呼出しを可能にするばかりでなく,外部プログラムにWolframシステムを呼び出させることを可能にする.

最も簡単に説明すると,WSTP関数で文字列をWolframシステムに送信することができる.Wolframシステムはその文字列を評価し,文字列が指定する作用を生成するが,その評価の結果は外部関数へは戻らない.

戻り値を得るには,EvaluatePacketを明示的にWolframシステムに送信して,戻ってくるReturnPacketの中身を読む必要がある.

EvaluatePacketを開始する.
WSPutFunction(stdlink, "EvaluatePacket", 1);
Factorial[7]もしくはの式を構成する.
  WSPutFunction(stdlink, "Factorial", 1);
WSPutInteger32(stdlink, 7);
パケットの構成終了を示す.
WSEndPacket(stdlink);
ReturnPacketが返っていることをチェック.
WSCheckFunction(stdlink, "ReturnPacket", &n);
パケットからの結果(整数)を取り出す.
WSGetInteger32(stdlink, &ans);
WSEndPacket(stdlink)パケットが終了,Wolframシステムへの送信が可能なことを示す

パケットをWolframシステムへ送信する

EvaluatePacket[input]をWolframシステムに送信すると,それに対して一般にたくさんのパケットが生成されるが,最後のパケットはReturnPacket[output]になる.前もって構造を知ることのできないパケットや式の列を扱う方法については「外部プログラム中で式を処理する」で解説する.