外部プログラム内から Mathematica を呼び出す
外部プログラム内から
Mathematica を呼び出すためには
MathLink の一般的な多くの機能を利用する必要がある.まず最初は,
Mathematica との
MathLink コネクションを確立することである.
Mathematica から呼出し可能な外部プログラムを作成するのに
MathLink テンプレートを利用した場合は,
MathLink コネクションを確立するためのソースコードが自動的に作成され,外部プログラムは単に
MLMain(argc, argv)を呼び出すだけでよい.しかし,一般に,
MathLink コネクションを確立するには関数を何個か呼び出す必要がある.
MathLink コネクションの開閉
int main(int argc, char *argv[]) {
MLENV env; MLINK link; int errno;
|
MathLink コネクションを開く.メインプログラムに与えられた引数を使う.
link = MLOpenArgcArgv(env, argc, argv, &errno);
|
コネクションを活性化し,もう一方のプログラムが応答するのを待つ. |
MLOpenArgcArgv()に渡す
argvは,プログラムを開始させたときに
main()に渡される
argvが直接使われることがほとんどである.
argv中の要素は,
Mathematica 関数の
LinkLaunch,
LinkCreateと
LinkConnectで使用する引数やオプションを表す文字列である.
| "-linklaunch" | LinkLaunch["name"]のように作用する |
| "-linkcreate" | LinkCreate["name"]のように作用する |
| "-linkconnect" | LinkConnect["name"]のように作用する |
| "-linkname","name" | 使用する名前を与える |
| "-linkprotocol","protocol" | 使用するリンクプロトコル((TCPIP,Pipes等)を与える |
MLOpenArgcArgv()に渡す配列argvに設定可能な要素
MLOpenArgcArgv()の代りに,引数をスペース文字で区切って連結した1つの文字列として受け取る
MLOpenString()を利用することもできる.
Mathematica カーネルとの
MathLink コネクションを開いたあとは,標準の
MathLink 関数を呼んでデータを,
MathLink コネクション上で交換できるようになる.
Mathematica カーネルと通信するためによく使う関数
MLPutFunction()その他でパケットを全部送り終えたら,
MLEndPacket()を呼んで,
MathLink と同期,調和を取る必要がある.
Mathematica カーネルと直に通信する外部プログラムを書く第1の目的は,カーネルが生成するさまざまな種類のパケットを処理することである.
関数
MLNextPacket()はカーネルからくる次のパケットの頭部を見付け,パケットの種類を表す定数を返す.
MLNextPacket()が認識するパケットの一部
while ((p = MLNextPacket(link)) && p RETURNPKT) MLNewPacket(link);
|
Mathematica の完全なフロントエンドを書く場合は,カーネルが生成するあらゆる種類のパケットを処理する必要がある.
MLNextPacket()が返す値に応じて適当に
switchを書けば問題ない.
MathLink デベロッパーキットには,簡単だが完全なフロントエンドのソースコードがいくつか入っている.
リンク上のデータの流れ
フロントエンドのような,より洗練された外部プログラムでは,
Mathematica が送ってくるデータを待つ間でも,何等かのオペレーションを実行する必要がある場合もある.
MLNextPacket()のような標準
MathLink ライブラリ関数を呼び出すと,プログラムはその関数が必要とするすべてのデータが得られるまで実行をブロックしてしまう.
MLReady()を繰り返し呼び,
MLReady()が
0を返さなくなった時点で
MLNextPacket()を呼ぶようにすれば,ブロックするのを避けることができる.
MLReady()は
Mathematica 関数
LinkReadyQと類似の関数である.
MathLink が,送信が指令されたデータをバッファリングする場合もある.必要なデータを確実に送信するためには
MLFlush()を使う.その後は
MLReady()を呼び,返ってくるデータを待つのみである.