外部プログラムとの双方向通信
Installを使って MathLink 適合プログラムをインストールする場合,そのプログラムの振舞いはやや単純化された Mathematica カーネルと似ている.外部プログラム中の関数を呼び出すときは必ずCallPacketがプログラムに送られ,プログラムは呼び出された関数の結果をReturnPacketで包み込んで返送する.
| Out[1]= |  |
| Out[4]= |  |
外部プログラム1個に対して複数のInstallを実行すると,Mathematica はそのプログラムと複数のコネクションを開く.それぞれのコネクションは独立したLinkObjectとして働く.
外部プログラムの異なるインスタンスを特定する
:Pattern: addto[$CurrentLink, n_Integer]
:Arguments:
n
:ArgumentTypes:
Integer
:ReturnType: Integer
:End:
プログラムの開始時に大域変数の

をゼロに設定する.
int addto(int n) 
counter += n;
return counter;


を含んでいる外部プログラムのインスタンスをインストールする.
| Out[5]= |  |
| Out[6]= |  |
外部プログラムの最初のインスタンスのcounterに10を足す.
| Out[7]= |  |
外部プログラムの2番目のインスタンスのcounterに15を足す.
| Out[8]= |  |
| Out[9]= |  |
外部プログラムにその状態を管理させて,異なる状態の異なるインスタンスを利用することもできる.$CurrentLinkはプログラムのそれぞれのインスタンスを示している.
$CurrentLinkの値は,プログラムが最初にインストールされるときと同様,プログラムのインスタンスが呼ばれるたびに一時的に設定される.
Mathematica が評価すべき文字列を送信する
MathLink 接続の双方向性は,Mathematica に外部プログラムの呼出しを可能にするばかりでなく,外部プログラムに Mathematica を呼び出させることを可能にする.
最も簡単に説明すると,MathLink 関数
で文字列を Mathematica に送信することができる.Mathematica はその文字列を評価し,文字列が指定する作用を生成するが,その評価の結果は外部関数へは戻らない.
戻り値を得るには,EvaluatePacketを明示的に Mathematica に送信して,戻ってくるReturnPacketの中身を読む必要がある.
MLPutFunction(stdlink, "EvaluatePacket", 1);
MLPutFunction(stdlink, "Factorial", 1);
MLPutInteger32(stdlink, 7);
MLCheckFunction(stdlink, "ReturnPacket", &n);
パケットから

の結果(整数)を取り出す.
MLGetInteger32(stdlink, &ans);
パケットを Mathematica へ送信する
EvaluatePacket[input]を Mathematica に送信すると,それに対して一般にたくさんのパケットが生成されるが,最後のパケットはReturnPacket[output]になる.前もって構造を知ることのできないパケットや式の列を扱う方法については「外部プログラム中で式を処理する」で解説する.