This is documentation for Mathematica 4, which was
based on an earlier version of the Wolfram Language.
View current documentation (Version 11.1)

 Documentation /  Mathematica /  Das Mathematica Buch /  Die Prinzipien von Mathematica /  MathLink und externe Programm-Kommunikation /

Kommunizieren zwischen Mathematica-Sessionen mit MathLinkSpezialthema: Kommunikation mit Mathematica-Benutzeroberflächen

2.12.7 Aufruf von Mathematica-Unterprozessen

Verbindung zu einem Unterprogramm via MathLink

Dies startet einen Mathematica-Unterprozeß auf dem hier verwendeten Computersystem.

In[1]:=link = LinkLaunch["math -mathlink"]

Out[1]=LinkObject[math -mathlink, 4, 4]

Hier ist ein Paket, das das erste Eingabeprompt des Mathematica-Unterprozesses repräsentiert.

In[2]:= LinkRead[link]

Out[2]=InputNamePacket[In[1]:= ]

Dies schreibt ein Paket, das Text repräsentiert, der zur Eingabe in den Mathematica-Unterprozeß gedacht ist.

In[3]:= LinkWrite[link, EnterTextPacket["10!"]]

Hier ist ein Paket, das das Ausgabeprompt des Mathematica-Unterprozesses darstellt.

In[4]:= LinkRead[link]

Out[4]=OutputNamePacket[Out[1]= ]

Und hier ist das eigentliche Ergebnis der Berechnung.

In[5]:= LinkRead[link]

Out[5]=ReturnTextPacket[3628800]

Zur Organisation verschiedener, in eine Mathematica-Session eingebundener Objekte werden hauptsächlich MathLink-Pakete verwendet. Ein MathLink-Paket ist einfach ein Ausdruck mit einem definierten Kopf, der die Aufgabe bzw. die Bedeutung kennzeichnet.

Grundlegende Pakete, die in Mathematica-Sessionen verwendet werden

Die Tatsache, daß LinkRead ein InputNamePacket zurückgibt, zeigt an, daß der Unterprozeß Mathematica nun für eine neue Eingabe bereit ist.

In[6]:= LinkRead[link]

Out[6]=InputNamePacket[In[2]:= ]

Hiermit werden zwei Print-Anweisungen als Input eingegeben.

In[7]:= LinkWrite[link, EnterTextPacket["Print[a]; Print[b];"]]

Hier ist der Text vom ersten Print.

In[8]:= LinkRead[link]

Out[8]=TextPacket[a
]

Und hier ist Text vom zweiten Print.

In[9]:= LinkRead[link]

Out[9]=TextPacket[b
]

Es wird keine Ausgabezeile erzeugt. Das neue Paket ist daher ein InputNamePacket.

In[10]:= LinkRead[link]

Out[10]=InputNamePacket[In[3]:= ]

Einige zusätzliche Pakete, die in Mathematica-Sessionen erzeugt werden

Erfolgt Ihre Eingabe für Mathematica mit EnterTextPacket["eingabe"], dann wird Mathematica automatisch eine Zeichenketten-Version Ihrer Ausgabe erzeugen und mit ReturnTextPacket["ausgabe"] antworten. Erfolgt die Eingabe hingegen mit EnterExpressionPacket[ausdr], dann wird Mathematica mit ReturnExpressionPacket[ausdr] reagieren und Ihre Ausgabe nicht in eine Zeichenkette umwandeln.

Pakete, die mit Ausdrücken Ein- und Ausgabezeilen repräsentieren

Dies fügt einen Ausdruck in eine Mathematica-Untersession ein, ohne ihn zu evaluieren.

In[11]:= LinkWrite[link, Unevaluated[EnterExpressionPacket[
Factor[x^6 - 1]]]]

Hier sind die nachfolgenden 3 Pakete, die von der Mathematica-Untersession zurückkommen.

In[12]:= Table[LinkRead[link], 3]

Out[12]=

InputNamePacket- und OutputNamePacket-Pakete sind häufig gut dazu geeignet, den aktuellen Status einer Mathematica-Untersession feststellen zu können. Sie können aber die Erzeugung dieser Pakete unterdrücken, indem Sie die Mathematica-Untersession mit einer Zeichenkette, wie zum Beispiel "math -mathlink -batchoutput", aufrufen.

Auch wenn die explizite Erzeugung von InputNamePacket- und OutputNamePacket-Paketen unterdrückt wird, wird Mathematica dennoch jede Eingabe, die mit EnterTextPacket oder EnterExpressionPacket erfolgte, so verarbeiten, als ob eine Eingabezeile eingegeben worden sei. Dies bedeutet zum Beispiel, daß Mathematica $Pre und $Post aufrufen und In[$Line] und Out[$Line] Werte zuordnen wird.

Evaluierung von Ausdrücken ohne explizite Ein- und Ausgabezeilen

Dies sendet ein EvaluatePacket. Unevaluated verhindert eine Evaluierung, bevor das Paket gesendet wird.

In[13]:= LinkWrite[link, Unevaluated[EvaluatePacket[10!]]]

Das Ergebnis ist ein reines ReturnPacket.

In[14]:= LinkRead[link]

Out[14]=

Dies sendet ein EvaluatePacket, das die Evaluierung von Print[x] anfordert.

In[15]:= LinkWrite[link, Unevaluated[EvaluatePacket[Print[x]]]]

Das erste Paket, das zurückkommt, ist ein TextPacket, das durch Print erzeugten Text repräsentiert.

In[16]:= LinkRead[link]

Out[16]=TextPacket[x
]

Danach wird das eigentliche Ergebnis von Print zurückgegeben.

In[17]:= LinkRead[link]

Out[17]=ReturnPacket[Null]

In den meisten Fällen kann man vernünftigerweise annehmen, daß Mathematica nach Senden eines EvaluatePacket zu Mathematica einfach eine Berechnung durchführt sowie diverse andere Pakete und zum Abschluß ein ReturnPacket zurückgeben wird. Wenn bei der Berechnung jedoch eine Funktion wie Input auftaucht, dann wird Mathematica eine zusätzliche Eingabe anfordern müssen, bevor es mit der Berechnung fortfahren kann.

Dies sendet ein Paket, dessen Evaluierung eine Input-Funktion enthält.

In[18]:= LinkWrite[link,
Unevaluated[EvaluatePacket[2 + Input["data ="]]]]

Es kommt ein InputPacket zurück; dies zeigt an, daß eine weitere Eingabe erforderlich ist.

In[19]:= LinkRead[link]

Out[19]=InputPacket[data =]

Zu diesem Zeitpunkt ist nichts mehr im Link, das gelesen werden kann.

In[20]:= LinkReadyQ[link]

Out[20]=False

Dies fügt eine weitere Eingabe hinzu.

In[21]:= LinkWrite[link, EnterTextPacket["x + y"]]

Nun kann die Input-Funktion evaluiert werden. Ein ReturnPacket wird erzeugt.

In[22]:= LinkRead[link]

Out[22]=ReturnPacket[2 + x + y]

Unterbrechen eines MathLink-kompatiblen Programms

Dies sendet eine sehr zeitaufwendige Berechnung zum Unterprozeß.

In[23]:= LinkWrite[link,
EnterTextPacket["FactorInteger[2^777-1]"]]

Die Berechnung ist noch im Gange.

In[24]:= LinkReadyQ[link]

Out[24]=False

Dies sendet einen Interrupt.

In[25]:= LinkInterrupt[link]

Nun hat der Unterprozeß gestoppt und sendet ein Interrupt-Menü zurück.

In[26]:= LinkRead[link]

Out[26]=MenuPacket[1, Interrupt> ]

Kommunizieren zwischen Mathematica-Sessionen mit MathLinkSpezialthema: Kommunikation mit Mathematica-Benutzeroberflächen