|
2.13.7 補助的なMathematicaプロセスを呼び出す

MathLinkを使って補助的プログラムと接続する
利用中のコンピュータで補助的Mathematicaプロセスを開始させる.
In[1]:=link = LinkLaunch["math -mathlink"]
Out[1]=LinkObject[math -mathlink, 4, 4]
補助的 Mathematicaプロセスからの最初の入力プロンプトを表すパケット.
In[2]:= LinkRead[link]
Out[2]=InputNamePacket[In[1]:= ]
補助的 Mathematicaプロセスの入力となるテキストを表すパケットを書き込む.
In[3]:= LinkWrite[link, EnterTextPacket["10!"]]
補助的 Mathematicaプロセスからの出力プロンプトを表すパケット.
In[4]:= LinkRead[link]
Out[4]=OutputNamePacket[Out[1]= ]
これが実際に計算した結果である.
In[5]:= LinkRead[link]
Out[5]=ReturnTextPacket[3628800]
MathLinkパケットは, Mathematicaセッションにかかわるさまざまなオブジェクトを系統立てて管理するために使用されている. MathLinkパケットは簡単に言えばパケットの役目や意味を示す一定の頭部を持った式である.

Mathematicaセッションの基本パケット
LinkReadが InputNamePacketを返すため,もう1つの Mathematicaセッションが入力待ちであることが分かる.
In[6]:= LinkRead[link]
Out[6]=InputNamePacket[In[2]:= ]
入力に Printコマンドを2つ与える.
In[7]:= LinkWrite[link, EnterTextPacket["Print[a]; Print[b];"]]
1番目の Printが返したテキスト.
In[8]:= LinkRead[link]
Out[8]=TextPacket[a ]
2番目の Printが返したテキスト.
In[9]:= LinkRead[link]
Out[9]=TextPacket[b ]
出力行は生成されず,次のパケットは InputNamePacketとなる.
In[10]:= LinkRead[link]
Out[10]=InputNamePacket[In[3]:= ]

Mathematicaセッション中で使用されるパケットの一部
EnterTextPacket["input"]で Mathematicaへ入力するとき, Mathematicaはその出力を自動的に文字列に変換し, ReturnTextPacket["output"]で応える.それとは別に, EnterExpressionPacket[expr]で入力を与えると, Mathematicaは ReturnExpressionPacket[expr]で応え,出力を文字列に変換することはしない.

式を使って入出力するためのパケット
補助的 Mathematicaセッションに式を評価することなく入力する.
In[11]:= LinkWrite[link, Unevaluated[EnterExpressionPacket[ Factor[x^6 - 1]]]]
補助的 Mathematicaセッションからは3つのパケットが返ってくる.
In[12]:= Table[LinkRead[link], {3}]
Out[12]= 
InputNamePacketと OutputNamePacketは補助的 Mathematicaセッションの現在の状態を知りたいときに利用することができる.補助的 Mathematicaセッションを"math -mathlink -batchoutput"で起動すれば,それらのパケットの生成を抑制することができる.
InputNamePacketパケットと OutputNamePacketパケットの明示的な生成を抑制していても, Mathematicaは,EnterTextPacketあるいは EnterExpressionPacketの入力を,あたかも入力行があるかのように処理する.つまり, Mathematicaは$Preと$Postを呼んで In[$Line]と Out[$Line]の値を代入する.

明示的な入力行・出力行なしで評価を実行する
EvaluatePacketを送信する. Unevaluatedはパケットが送信される前に評価されることを抑止する.
In[13]:= LinkWrite[link, Unevaluated[EvaluatePacket[10!]]]
結果は純粋な ReturnPacketである.
In[14]:= LinkRead[link]
Out[14]= 
Print[x]の評価を要求する EvaluatePacketを送る.
In[15]:= LinkWrite[link, Unevaluated[EvaluatePacket[Print[x]]]]
最初に返ってくるのは TextPacketであり, Printが生成するテキストを表して いる.
In[16]:= LinkRead[link]
Out[16]=TextPacket[x ]
そのあと, Printの結果が返ってくる.
In[17]:= LinkRead[link]
Out[17]=ReturnPacket[Null]
ほとんどの場合, EvaluatePacketを送信することによって, Mathematicaは計算を実行し, ReturnPacketで終るさまざまなパケットを返してくると思っていいだろう.しかし,実行すべき計算が Inputのような関数を含んでいる場合, Mathematicaは計算を続ける前にさらに入力を要求してくる.
Input関数の評価を含むパケットを送信する.
In[18]:= LinkWrite[link, Unevaluated[EvaluatePacket[2 + Input["data ="]]]]
返ってくるパケットはInputPacketであり,入力が必要なことを示している.
In[19]:= LinkRead[link]
Out[19]=InputPacket[data =]
リンクには読むべきパケットが残っていない.
In[20]:= LinkReadyQ[link]
Out[20]=False
入力を与える.
In[21]:= LinkWrite[link, EnterTextPacket["x + y"]]
Input関数が評価され,ReturnPacketが生成された.
In[22]:= LinkRead[link]
Out[22]=ReturnPacket[2 + x + y]

MathLink適合プログラムへの割込み
非常に時間のかかる計算を補助的プロセスに送る.
In[23]:= LinkWrite[link, EnterTextPacket["FactorInteger[2^777-1]"]]
まだ計算中である.
In[24]:= LinkReadyQ[link]
Out[24]=False
割 込み信号を送る.
In[25]:= LinkInterrupt[link]
補助的なプロセスは中断し,割込みメニューを返してくる.
In[26]:= LinkRead[link]
Out[26]=MenuPacket[1, Interrupt> ]
|