Mathematica 9 is now available

Documentation / Mathematica / Mathematicaブック / Mathematicaの仕組み / MathLinkと外部プログラム通信 /

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> ]



Any questions about topics on this page? Click here to get an individual response.Buy NowMore Information
THIS IS DOCUMENTATION FOR AN OBSOLETE PRODUCT.
SEE THE DOCUMENTATION CENTER FOR THE LATEST INFORMATION.