223 72 8MB
German Pages 272 [276] Year 1983
de Gruyter Lehrbuch Hesse/Kirsten - Einführung in die Programmiersprache MUMPS
Stephan Hesse • Wolfgang Kirsten
Einführung in die Programmiersprache MUMPS
w DE
c_
Walter de Gruyter • Berlin • New York 1983
Stephan Hesse Wolfgang Kirsten Mitarbeiter am Zentrum der Medizinischen Informatik, Abteilung für Dokumentation und Datenverarbeitung, des Klinikums der Johann Wolfgang Goethe-Universität, Frankfurt
CIP-Kurztitelaufnahme der Deutschen Bibliothek Hesse, Stephan: Einführung in die Programmiersprache MUMPS/Stephan Hesse; Wolfgang Kirsten. - Berlin; New York: de Gruyter, 1983 (De-Gruyter-Lehrbuch) ISBN 3-11-009746-X NE: Kirsten, Wolfgang
©Copyright 1983 by Walter de Gruyter&Co., vormals G. J. Göschen'sche Verlagshandlung. J. Guttentag, Verlagsbuchhandlung Georg Reimer, Karl. J. Trübner, Veit & Comp., Berlin 30. Alle Rechte, insbesondere das Recht der Vervielfältigung und Verbreitung sowie der Übersetzung, vorbehalten. Kein Teil des Werkes darf in irgendeiner Form (durch Fotokopie, Mikrofilm oder ein anderes Verfahren) ohne schriftliche Genehmigung des Verlages reproduziert oder unter Verwendung elektronischer Systeme verarbeitet, vervielfältigt oder verbreitet werden. Printed in Germany. Druck: Gerike GmbH, Berlin. Bindearbeiten: Lüderitz & Bauer, Berlin.
Geleitwort MUMPS hat
seinen
Namen
vom
Massachusetts
Hospital. Es wurde dort unter der Leitung von
General Dr.G.Octo
Barnett Mitte der sechziger Jahre entwickelt. Lange Zeit galt es als
Geheimtip für leistungsfähige
Dialogsysteme
mit minimiertem Programmieraufwand auf Kleinrechnern. Mit der Standardisierung
durch
das
American
National
Bureau of Standards 1976 wurde ein bislang
unerreichtes
Maß an Portabilität erzielt. Seitdem
es
gibt
Tausende
von Installationen weltweit mit starken
Benutzergruppen
in Japan, USA, Südamerika
Standard
Programme
laufen
und
unverändert
Europa. auf
MUMPS
Personalcomputern,
"klassischen" Mini-Implementationen und Großystemen mit oder ohne eigenes Timesharing
Betriebssystem.
In mancher Hinsicht kann MUMPS als Geheimwaffe gegen die Softwarekrise verstanden werden, es erlaubt: - Hardwareunabhängigkeit
in bisher ungekanntem Ausmaß
- Programmaustausch weltweit - Sicherung der Softwareinvestitionen insbesondere bei der so wichtigen
Benutzerschnittstelle
- Schaffung hochkomplexer Anwendungsgeneratoren mit minimalem
Programmieraufwand
- optimierte Datenhaltung für Texte.
VI
Geleitwort
MUMPS hat bisher ein Schattendasein geführt. Es verdient wegen seiner
Leistungsfähigkeit
Leiter der Abteilung
für
mehr
Beachtung.
Dokumentation
arbeitung am Klinikum der Johann Wolfgang sität und Executive Secretary
der
MUMPS
und
Als
Datenver-
Goethe-UniverUsers'
Group
Europe freue ich mich über das Erscheinen einer deutschsprachigen Einführung in
die Sprache. Meine Mitarbeiter
haben sie, angesteckt durch
die
Idee,
opferbereit
Feierabenden und langen Wochenenden auf dem Boden
an
ihrer
Kurserfahrung ausgearbeitet. Ihnen gebührt Dank und Lob, dem Buch weite Verbreitung! W. Giere, im Mai 1983
Vorwort MUMPS ist eine der wenigen von der mierungsbehörde
standardisierten
sprachen. Trotzdem ist sie
in
amerikanischen höheren
weiten
Programmier-
Fachkreisen
wenig bekannt. MUMPS ist das Akronym für
sich
interpretative
stichwortartig
Sprache,
folgendermaßen
nur
'Massachusetts
General Hospital's Utility Multiprogramming MUMPS ist eine
Nor-
System'.
deren
Vorzüge
charakterisieren
lassen: 1. Die Sprache enthält eine komplette
Datenhaltungs-
und -Verwaltungskomponente. 2. Die Sprache enthält leistungsfähige Funktionen und Operatoren für komplexe MUMPS ist
eine
Textverarbeitung.
nichtmathematische
Programmiersprache.
Das bedeutet, daß die Konzeption der Sprache lich nichtnumerische
Anwendungsgebiete
hauptsäch-
vorsieht.
Hauptanwendungen liegen im Bereich der
Ihre
Textmanipulation
und Datenverwaltung. Beispielsweise wurde die gesamte Textverarbeitung Lehrbuches mit MUMPS-Programmen
vorgenommen.
MUMPS ist eine prinzipiell einfach zu
erlernende
che. Selbst ein Anfänger, der
bisher
keinen
gefunden
hat,
wenig Zugang zur
Informatik
kurzer Zeit einfache
Aufgaben
seits enthält die Sprache - etwa die zur die es dem
dieses
oder kann
programmieren.
ungewöhnliche
Spranur nach
Anderer-
Sprachelemente
dynamischen Veränderung von Programmen -
erfahrenen Programmierer gestatten,
Software zu erstellen.
komplexe
VIII
Vorwort
MUMPS wurde ursprünglich für den Einsatz auf
Minicompu-
tern entworfen. Seit neuerer Zeit ist aber MUMPS auch zu einem erstaunlich günstigen Preis auf vielen Mikrocomputern verfügbar. Wir haben die einfache prozedur von MUMPS auf
einem
Implementierungs-
Mikrocomputer
Betriebssystem CP/M beschrieben,
das
unter
gegenwärtig
dem eine
Art de facto Standard darstellt. Der interessierte Leser findet die Bezugsquelle im Anhang. An welchen Leserkreis richtet sich dieses Buch? In erster Linie ist es für den Anfänger im Programmieren gedacht, der eine einfache
und
doch
grammiersprache erlernen möchte.
Derjenige
schon über Programmiererfahrung es als Nachschlagewerk
vielseitige
in
Pro-
Leser,
der
MUMPS verfügt,
kann
verwenden, zumal der Sprachstan-
dard von 1982 an allen Stellen
komplett
wurde. Es wendet sich aber auch an alle, grammsystemen arbeiten, die
berücksichtigt die
mit
Pro-
in MUMPS geschrieben wurden
und schließlich an den Informatiker, der disierte Sprache mit integrierter
eine
standar-
Datenhaltung
kennen-
lernen möchte. Der Inhalt des in 5
Kapitel
gegliederten
Manuskriptes
läßt sich wie folgt charakterisieren. Das erste enthält neben einfachen
allgemeinen
Kapitel
Konventionen
einmal eine Zusammenfassung über das Wesen von
noch
Program-
miersprachen auf einem sehr elementaren Niveau. Das zweite Kapitel beleuchtet
die
grammflusses, wobei hier
grundlegenden
die
Steuerung
des
Pro-
Wesenszüge
von MUMPS schon deutlich hervortreten. In den nächsten drei Kapiteln wird nun verstärkt auf die besonderen Merkmale von Kapitel werden
die
MUMPS
eingegangen.
Im dritten
Textverarbeitungsmöglichkeiten
der
Vorwort
IX
Sprache dargestellt, im vierten Kapitel der außerordentlich interessante Datenbankteil fünften Kapitel der Entwurf
der Sprache, während im
und
die
Realisierung
Programmsystemen mit MUMPS und fortgeschrittene
von
Sprach-
konzepte im Vordergrund stehen. Jedem Kapitel folgt ein Exkurs über interessante
Einzel-
heiten der Sprache. Darin werden etwa die Entstehung und weitere Entwicklung
von
MUMPS
angesprochen
oder
die
sinnvolle Verwendung der Sprache. Diese Teile sind nicht Voraussetzung für das
Verständnis
der
übrigen Kapitel
und können daher übergangen werden. Im Text
wird
die
Wirkungsweise
direkt an Beispielen
jedes
dargestellt.
Daher
Sprachelements entfällt
die
Notwendigkeit, über einen MUMPS-Interpreter zu verfügen, um die Sprache zu lernen. Da das Buch auch als Nachschlagewerk für den
erfahrenen
MUMPS-Programmierer gedacht ist,
einen aus-
haben
führlichen Anhang erstellt. Neben einer
wir
Zusammenfassung
aller im Sprachstandard definierten Befehle, Funktionen, speziellen Variablen und
Operatoren
findet
der
Leser
eine Übersicht über die Unterschiede des Sprachstandards von 1977 gegenüber dem von 1982. Ein ausführlicher
Index
beschließt das vorliegende Buch. Wir wollen dieses Vorwort nicht abschließen, ohne denjenigen zu
danken,
die
Manuskripts ihren Anteil möchten wir
Frans
Witte
an
der
haben. danken,
Entstehung
Für für
allen dieses
einige
Beispiele
eine
kritische
Durchsicht Dr. Hans Ackermann. Stephen Johnson sind zu Dank verpflichtet für seine wertvollen Hinweise
wir über
den neuen Standard der Sprache und über MUMPS auf Mikrocomputern. Albrecht Padmanabhan schließlich hat uns dank seiner großen Erfahrung in der Programmierung mit
MUMPS
X
Vorwort
wertvolle Ratschläge gegeben. Seine zahlreichen
inhalt-
lichen und formalen Anmerkungen haben uns sehr geholfen. Unser besonderer Dank gilt Herrn Prof. Dr.med. Giere, der als Leiter der
Abteilung
für
Wolfgang
Dokumentation
und Datenverarbeitung und als langjähriger
Vorsitzender
der europäischen MUMPS USER'S Group vieles für genwärtige Verbreitung von
MUMPS
in
die
hat und der die Entstehung dieses Lehrbuches von an wohlwollend Über das zu
ge-
Deutschland getan Anfang
förderte.
erwartende
Maß
hinaus
hat er
uns
immer
wieder wertvolle Hinweise und nützliche Anregungen gegeben. Ferner danken die Verfasser dem die angenehme
de Gruyter
Verlag
für
Zusammenarbeit.
Frankfurt, im April
1983
Stephan Hesse Wolfgang Kirsten
Inhalt 1. E i n f ü h r u n g
in die G r u n d b e g r i f f e
1.1 A l l g e m e i n e B e m e r k u n g e n über
1 Programmier-
sprachen
1
1.2 K o n v e n t i o n e n
1. T e i l
6
1.3 B e i s p i e l e e i n f a c h e r B e f e h l e
10
1.4 Z a h l e n in M U M P S u n d n u m e r i s c h e O p e r a t i o n e n
20
1.5 Z e i c h e n v o r r a t u n d Z e i c h e n k e t t e n
26
1.5.1 Der g r a f i s c h e Z e i c h e n s a t z
und
Stringliterale 1.5.2 Der M U M P S - D a t e n t y p u n d d i e
26 numerische
Interpretation 1.6 P r o g r a m m e A
in M U M P S
Die bisherige Entwicklung von MUMPS
2. D i e S t e u e r u n g des P r o g r a m m f l u s s e s
31 35 41 47
2.1 K o n v e n t i o n e n 2. T e i l
47
2.2 A u f r u f v o n U n t e r p r o g r a m m e n
50
2.3 V e r g l e i c h s - u n d l o g i s c h e O p e r a t o r e n
57
2.3.1 V e r g l e i c h s o p e r a t o r e n
57
2.3.2 L o g i s c h e O p e r a t o r e n u n d die logische Interpretation 2.4 B e d i n g t e P r o g r a m m a u s f ü h r u n g
62
2.5 P r o g r a m m v e r z w e i g u n g
68
2.6 Das P o s t c o n d i t i o n a l
70
2.6.1
Das B e f e h l s p o s t c o n d i t i o n a l
2.6.2 D a s A r g u m e n t p o s t c o n d i t i o n a l 2.7 Die A u s w a h l f u n k t i o n $ S E L E C T
B
59
70 72 76
2.8 W i e d e r h o l t e P r o g r a m m a u s f ü h r u n g
78
2.9 P r o g r a m m u n t e r b r e c h u n g
84
Typische Einsatzgebiete von MUMPS
87
XII
Inhalt
3. T e x t v e r a r b e i t u n g m i t M U M P S
95
3.1 F u n k t i o n e n zur T e x t m a n i p u l a t i o n
95
3.2 D i e s p e z i e l l e V a r i a b l e $ H O R O L O G
106
3.3 O p e r a t o r e n zur T e x t m a n i p u l a t i o n
109
3.4 D i e B e n u t z u n g e x t e r n e r G e r ä t e u n d T i m e o u t
116
3.5 D i e F o r m a t i e r u n g der A u s g a b e
122
3.6 D i e F u n k t i o n $ J U S T I F Y
127
3.7 Z e i c h e n d a r s t e l l u n g u n d
Konvertierungs-
funktionen C
130
Die sinnvolle Verwendung von MUMPS
137
4. D i e S t r u k t u r der V a r i a b l e n
145
4.1 I n d i z i e r t e V a r i a b l e n 4.2 V e r s c h i e d e n e I n t e r p r e t a t i o n e n
145 der
Datenstruktur
D
4.3 Die A n a l y s e der S t r u k t u r
150
4.4 L ö s c h e n von V a r i a b l e n
153
4.5 O r d n u n g u n d O r d n u n g s f u n k t i o n e n
156
4.6 G l o b a l e V a r i a b l e n
160
4.7 N a k e d R e f e r e n c e
162
4.8 D a s S p e r r e n v o n V a r i a b l e n
166
4.9 B e i s p i e l e zu d e n O r d n u n g s f u n k t i o n e n
172
Der MUMPS-Standard
179
5. F o r t g e s c h r i t t e n e P r o g r a m m i e r t e c h n i k e n
E
147
185
5.1 D y n a m i s c h e V e r ä n d e r u n g v o n P r o g r a m m e n
185
5.2 M o d u l a r e r E n t w u r f v o n P r o g r a m m s y s t e m e n
194
5.3 M U M P S - P r o z e s s e u n d d e r e n S t e u e r u n g
199
5.4 P o r t a b i l i t ä t v o n M U M P S - P r o g r a m m e n
203
M U M P S auf M i k r o c o m p u t e r n
209
Inhalt Anhang I
II
Zusammenfassung der Sprache
XIII 217 218
Übersicht über Befehle
218
Übersicht über Funktionen
229
Übersicht über spezielle Variablen
236
Übersicht über Operatoren
239
Übersicht über den neuen Standard
245
III Verzeichnis der ASCII-Zeichen
251
IV
Literaturverzeichnis
254
V
Adresse der MUMPS Users1 Group
256
Sachregister
257
1. Einführung in die Grundbegriffe 1.1 Allgemeine Bemerkungen über Programmiersprachen Eine Programmiersprache natürlichen Sprache
ist
wie
Unterschied besteht darin, zur Kommunikation
vergleichbar
Deutsch daß
zwischen
Programmiersprache
aber
oder
einer Der
eine natürliche Sprache
Mensch
zur
mit Englisch.
und
Mensch,
Kommunikation
eine
zwischen
Mensch und Maschine dient. Auch das Lernen einer Programmiersprache ist Punkten mit dem Lernen einer gleichbar: Wenn fängt es mit
ein
Kind
seine
dem Gebrauch
häufige Wiederholung und
natürlichen nur
in
vielen
Sprache
Muttersprache eines Wortes
Benutzung
verlernt,
an. Durch
dieses einen Wortes
wird das Kind sich immer sicherer über dessen und Aussprache. Im Laufe der Zeit kommen
Bedeutung
weitere
Worte
dazu, die nach dem gleichen Mechanismus gelernt werden. In gleicher Weise verläuft
das
Lernen
miersprache. Anfangs betrachtet
man
einer
nur
Worte dieser Sprache und lernt durch
Program-
einige wenige
häufige
mit ihnen umzugehen. Im Laufe
der
Sprachelemente dazu, bis
den gesamten Sprachumfang
man
Zeit
Anwendung
kommen
andere
kennt und anwenden kann. Da Worte alleine
nur
eine
sehr
geringe
haben, fügt man mehrere Worte zu Sätzen ist jedoch nicht in
beliebiger
Aussagekraft
zusammen.
Kombination
der
Dies Worte
möglich, sondern es müssen genau festgelegte Regeln, die sogenannte Grammatik der Sprache, beachtet werden. Auch für Programmiersprachen existieren die die Zusammenfügung
solche
Regeln,
von Sprachelementen zu Programm-
anweisungen und Programmen festlegen.
2
Programmiersprachen
So, wie ein Kind das Formen
von
verständlichen
Sätzen
und damit die Grundregeln der Grammatik lernt, ist in einer Programmiersprache
die
auch
Festlegung der syntak-
tischen Regeln eng mit der Einführung der Sprachelemente verknüpft. Was aber unterscheidet eine Programmiersprache von einer natürlichen Sprache? Wie bereits anfangs erwähnt, ist eine
Programmiersprache
ein Verständigungsmittel zwischen Mensch
und
Computer;
eine Sprache, die beide verstehen können. Diese wird benutzt, um Anweisungen des schine in einer Form zu
Menschen
formulieren,
an
die
Sprache die
das
Ma-
automa-
tische Ausführen der Anweisungen erlaubt. Dazu muß man wissen, daß
der Rechner nichts aus eigenem
Antrieb macht, sondern nur Anweisungen ausführt, die ihm in Form eines Programms übergeben werden. Dieses Programm muß jeden Schritt, der komplizierten Berechnung gemacht einer entsprechenden Anweisung Ein Beispiel dafür zwei Zahlen zu
ist
die
im
werden
Laufe muß,
einer
in
Form
enthalten. einfache
Aufgabenstellung,
addieren. Die zugehörige
Anweisungsfolge
müßte dann etwa wie folgt aussehen: 1.
Erfrage erste Zahl!
2.
Erfrage zweite Zahl!
3. 4.
Addiere die beiden Zahlen! Gib Summe der beiden Zahlen aus!
Da der Rechner nichts ohne
Anweisung macht, ist es not-
wendig, in einem Programm für alle denkbaren
Fälle
An-
weisungen vorzusehen, die dem Rechner sagen, wie er sich in diesem speziellen Fall verhalten soll. Daher ist es sehr wichtig, sich möglichst vor dem Beginn der Programmierarbeiten über
die
verschiedenen
Kombi-
Programmiersprachen
3
nationsmöglichkeiten der Eingabedaten Gedanken zu machen und für alle möglichen Kombinationen
Programmanweisungen
vorzusehen. Wenn man das Obenstehende liest, könnte man
daraus
Schluß ziehen, daß es vollkommen ausreicht, einmal
den eine
Programmiersprache zu definieren und diese dann in aller Zukunft für alle Probleme
einzusetzen.
Leider hat sich schon in
der Frühzeit der
EDV gezeigt,
daß eine Programmiersprache, die zwar für alle
Probleme
Lösungsmöglichkeiten bietet, die aber bei keinem Problem besondere Unterstützung gewährt, nur mit großem Programmieraufwand einzusetzen ist. Diese
ersten
Programmier-
sprachen nannte man ASSEMBLER-Sprachen. Um die Programmierung zu vereinfachen, führte man
daher
sogenannte 'höhere' Programmiersprachen ein. Sie ten Sprachmittel zur Verfügung, die einen viel
stellgrößeren
Funktionsumfang anboten, als dies die ASSEMBLER-Sprachen konnten. Da die Maschinen diese Sprachen nicht
mehr
'verstehen'
konnten, war man gezwungen, besondere Programme zu wickeln, die sie in die
Sprache
übersetzten,
ent-
die
die
Maschine bearbeiten konnte. Bei der Übersetzung von Programmen
gibt es wie
Übersetzung
zwei
eines
Schriftstückes
bei der
grundsätzlich
verschiedene Möglichkeiten. Die eine Möglichkeit darin das Schriftstück zu übersetzen
und
das
schriftlich festzuhalten.
man
diese
Überträgt
hensweise auf Programme,
wird
ein
höheren Programmiersprache einmalig Ergebnis abgespeichert, um
übersetzt
Ergebnis Vorge-
in und
einer das
jederzeit benutzbar zu sein.
Den Vorgang der Übersetzung nennt man das Übersetzungsprogramm
Programm
besteht
Compiler.
Compilierung
und
4
Programmiersprachen
Die andere Möglichkeit
besteht
darin, das Schriftstück
während des Lesens zu übersetzen. Das Ergebnis diesem Fall nicht
wird
in
schriftlich festgehalten bzw. gespei-
chert, sondern direkt bearbeitet. Im
Falle
eines
gramms spricht man bei dieser Vorgehensweise von
Prointer-
pretieren und nennt das diesen Vorgang ausführende
Pro-
gramm Interpreter. Der Vorteil der zweiten Möglichkeit liegt auf der
Hand:
So, wie man beliebige Schriftstücke ohne separate
Über-
setzung jederzeit lesen kann, kann aufwendige Compilierung
sofort
man
Programme Jedoch
muß
man, wenn man ein Programm mehrmals ausführen will,
bei
jedem Durchlauf erneut die
ausführen.
ohne
Arbeit
der
Übersetzung
in
Kauf nehmen. Auch MUMPS macht von dem
Verfahren
der
Interpretation
Gebrauch. Die Sprache zeichnet sich durch eine
einfache
Befehlsstruktur und eine
Befehlen
geringe
Anzahl
von
sowie durch eine sehr effiziente Verwaltung
von
Varia-
blen aus. Da MUMPS hauptsächlich bankverwaltung
für
Textverarbeitung und Daten-
(sog. kommerzielle EDV) entwickelt wurde,
ist es im wissenschaftlich / mathematischen Bereich mit einigen wenigen Grundfunktionen
nur
ausgestattet.
Im Vergleich mit z.B. BASIC fällt auf, daß MUMPS nur die arithmetischen Grundfunktionen
enthält,
während
auch kompliziertere Funktionen (je nach Dialekt metrische Funktionen,
Wurzelfunktionen,
BASIC
trigono-
Matrixfunktio-
nen, etc.) enthält. Im Gegensatz zu
diesen
mathematischen Elementen vieler
Programmiersprachen enthält MUMPS
Textverarbeitungsfunk-
tionen. Das sind Sprachmittel, die es auf einfache Weise gestatten, allgemeine Texte
(sogenannte
zu manipulieren. Ein Beispiel für eine kette ist:
Zeichenketten) solche
Zeichen-
Programmiersprachen
5
MUMPS IST EINE PROGRAMMIERSPRACHE Eine einfache aber
typische Aufgabe eines Textverarbei-
tungssystem ist nun:
füge nach
dem Wort EINE
das Wort
HOEHERE ein. Dazu sucht man
in der
Zeichenkette
trennt sie nach diesem Wort
das Wort
auf. Man erhält
EINE und somit zwei
Ketten: MUMPS IST EINE PROGRAMMIERSPRACHE Nun fügt man
an das
Ende
der ersten
Zeichenkette das
Wort HOEHERE an und verkettet beide Zeichenketten wieder zu einer einzigen. Das Ergebnis ist
dann
die
Zeichen-
kette: MUMPS IST EINE HOEHERE
PROGRAMMIERSPRACHE
MUMPS enthält neben diesen eben beschriebenen Funktionen noch eine Reihe
von
anderen
Textverarbeitungsmöglich-
keiten, die die Sprache ideal
für diese Art
der Daten-
verarbeitung erscheinen lassen. Texte verarbeiten und
Texte
abspeichern
gehören
zusammen. MUMPS unterstützt die dauerhafte von Daten beliebiger Art auf
besonders
und bietet vielfältige Möglichkeiten
zur
aber
Abspeicherung
einfache
Weise
Rückgewinnung
dieser Daten nach bestimmten Fragestellungen. Diese beiden
Sprachmerkmale
einfachen Erstellung
von
- in
Verbindung
Dialogprogrammen -
die Hauptanwendungsgebiete von MUMPS. Der
mit
der
bestimmen
interessierte
Leser findet in der Übersichtsgeschichte über die
typi-
schen Einsatzgebiete von MUMPS im Anschluß an Kapitel einige Beispiele.
2
6
Konventionen 1. Teil
12 Konventionen 1. Teil Wie in jeder Programmiersprache gibt es eine Reihe von einfachen
Absprachen,
Aufbau einer Programmzeile Einleuchtend und fast
auch die
in
den
MUMPS äußeren
festlegen.
selbstverständlich
sache, daß eine Zeile von
ist
die Tat-
links nach rechts gelesen und
abgearbeitet wird. Die Zeilen selbst enthalten im allgemeinen Befehle spricht auch von Kommandos). Sie bestehen
aus
(man
Befehls-
worten und Befehlsargumenten, die durch genau ein zeichen getrennt werden. Es können einer Programmzeile stehen,
die
mehrere dann
Leer-
Befehle
mit
einem
in oder
mehreren Leerzeichen getrennt werden müssen. Nun hat man in MUMPS den Wunsch - wie übrigens in
jeder
anderen Programmiersprache auch - die Programmzeilen und die in ihnen enthaltenen Befehle zu erläutern. Man möchte erklären,
was
eigentlich
geschieht. Dieser Vorgang erleichtert, Kommentare bringen. Kommentare sind
in
wird in
dieser durch
einer gibt
es
Kommentare nach dem letzten Befehl zeile stehen und
die
von dem
Möglichkeit
Programmzeile
geschriebener
Zeile erläutert. In MUMPS
Programmzeile
Text,
die in
anzu-
der
die
Regelung,
daß
einer
Programm-
übrigen Teil durch
ein Semi-
kolon (;) getrennt werden. Wir empfehlen,
recht
häufig
von dieser Möglichkeit Gebrauch zu machen. Kommentare werden selbstverständlich das bedeutet, der Interpreter
nicht
ignoriert
ausgeführt,
den
Rest
der
Programmzeile, sobald er ein Semikolon erkennt. Wir haben bis
hierher noch
Befehle gehört, die
in
nichts über die
einer
Zeile
Anzahl der
höchstens
stehen
Konventionen 1. Teil dürfen. Darüber wird auch in
der
Sprachkonvention
MUMPS nichts gesagt, aber es gibt eine Begrenzung rer Art: eine Programmzeile darf höchstens lang sein, natürlich
255
7 von ande-
Zeichen
einschließlich der Leerzeichen und
Kommentare. Es sind also so viele Befehle
erlaubt,
wie
in 255 Zeichen passen. Normalerweise werden Programmzeilen über
eine
maschinenähnliche Tastatur eingeben,
die
ein Bild-
Bildschirme
gestatten
schirm angeschlossen ist.
Viele
es, in eine Bildschirmzeile
80
an
Zeichen
Dann springt der Cursor - das ist
eine
dem Bildschirm, die die Position des benden Zeichens anzeigt - an Zeile. Damit
ist
den
keineswegs
zu
schreiben.
Markierung
nächsten
Anfang
die
schreib-
auf
einzuge-
der
nächsten
Programmzeile
abge-
schlossen. Vielmehr muß man das MUMPS ausdrücklich durch Betätigen einer besonderen ist bei
den
einzelnen
Taste mitteilen. Diese Taste
Herstellern
nicht
einheitlich
definiert. Häufig wird dafür die 'carriage return 1 benutzt. Auch wir werden diese Taste benutzen
und
Taste sym-
bolisieren das im Text mit . Ein Bildschirm enthält meistens 24 Zeilen. Es doch auch andere Formate, die
wir
hier
gibt
nicht
je-
berück-
sichtigen. Wenn also eine Bildschirmzeile
Zeichen,
eine
Pro-
grammzeile in MUMPS dagegen 255 Zeichen lang
80
ist,
dann
können wir 3 Bildschirmzeilen und noch 15 Zeichen in der vierten Zeile für
eine
Programmzeile
wir darüber hinaus, kommt eine
verwenden. Gehen
Fehlermeldung,
die
darauf hinweist, daß die Programmzeile zu lang
ist
und
In
der
von MUMPS nicht mehr Praxis sind
verstanden
Programmzeilen
selten anzutreffen, vielmehr
werden
solcher wird
Befehle in einer Bildschirmzeile
kann.
Länge man
uns
allerdings
versuchen,
unterzubringen.
die
8
Konventionen 1. Teil
Daß man überhaupt in einer Befehl schreibt, ist mehr MUMPS-Befehle betrachten
Zeile mehr als jeweils einen als eine
nur
Konvention.
Programmzeile
Einige
als
einheitliches Ganzes. Das ist eine Eigenheit von
ein MUMPS,
ein Umstand, der uns noch beschäftigen wird. Wenn wir im weiteren Verlauf Beispiele wir uns an die übliche
Arbeitsweise
Interpreter an. Hierbei gibt wenn er bereit ist, eine neue
der
angeben, mit
Rechner
Eingabe
zu
ein bestimmtes Zeichen aus, das 'Prompt'
lehnen
einem
MUMPS-
immer
dann,
verarbeiten, genannt
Wir symbolisieren dieses Verhalten dadurch, daß
wird. wir
in
den Beispielen ein Fragezeichen vor jede Anweisungszeile schreiben. Vergegenwärtigen wir uns noch einmal Befehlszeile, so wie wir
ihn
bis
den jetzt
Aufbau
einer
kennengelernt
haben: ?Befehlswort Argument hlswort Argument
Befehlswort Argument ; Kommentare
Befe
Wir haben dabei bewußt die Befehlskette
über
die
(Pa-
pier-) Zeile hinausgeschrieben und dabei den Beginn Zeile durch den
Prompt
der
gekennzeichnet. Die Abwesenheit
des Prompts in der zweiten Zeile zeigt uns, daß
es
ein
Folgezeile ist und nicht etwa eine neue Befehlszeile. Wir wollen
diesen
Abschnitt
über
Konventionen
nicht
abschließen, ohne darauf hinzuweisen, daß die Befehle in MUMPS Worte aus der englischen Sprache sind. Sie
müssen
in Großbuchs taben (A,B,C,...,Z) eingegeben werden. Überhaupt werden wir vorläufig keine Kleinbuchstaben verwenden.
Konventionen 1. Teil Der nächste Abschnitt wird uns einige einfache Beispiel bringen, die uns zeigen, wie natürlich die eben geschil derten Festlegungen im Sprachkonzept von MUMPS wirken.
10
Beispiele einfacher Befehle
1.3 Beispiele einfacher Befehle Wir wollen jetzt mit
den
ersten
Versuchen
mit
MUMPS
beginnen. Es wäre empfehlenswert, ist aber für das ständnis des Buches
nicht
Beispiele an einem Rechner
Ver-
Voraussetzung, die folgenden auszuprobieren.
Dazu ist es erst einmal notwendig, das
MUMPS-System
zu
starten. Dieser Vorgang ist von Hersteller zu Hersteller sehr verschieden. Daher können wir hier nur einige gemeine Punkte
all-
besprechen.
Größere Rechner fordern von dem Benutzer, durch Eingabe eines
daß
er
sich
Kennwortes als berechtigt ausweist.
Kleinere Rechner, wie z.B. Mikrocomputer, haben im
all-
gemeinen diesen Schutzmechanismus vor unbefugtem Zugriff nicht. Nachdem man sich als zugriffsberechtigt ausgewiesen hat, wird bei Systemen, die MUMPS
als
einzige
Programmier-
sprache anbieten (sogenannte stand alone Systeme), der Prompt des
MUMPS-Interpreters
Systemen, die die
Wahl
sichtbar
sein.
schon Bei
unter mehreren Programmierspra-
chen erlauben, muß man noch die Sprache MUMPS
anwählen,
bevor der Prompt erscheint. Im weiteren nehmen wir an, daß der Start von folgreich durchgeführt wurde
und
der
Prompt
MUMPS
er-
auf
dem
Bildschirm steht. Jetzt kann man dem Rechner zu tun hat. Beispiel ?WRITE HALLO 9
"HALL0"
eine Anweisung geben, was er
Beispiele einfacher Befehle
11
Dieses Beispiel zeigt schon den ersten Befehl von MUMPS, den WRITE-Befehl, der dazu verwendet wird, Texte auf den Bildschirm zu schreiben. Man beachte, daß, wie schon weiter schen dem Befehlswort WRITE
und
oben dem
erwähnt,
Argument
zwi-
"HALLO"
genau ein Leerzeichen steht. Die Schreibweise des Argumentes "HALLO" zeigt noch weitere wichtige Konvention von MUMPS: unveränderliche
Zeichenfolgen
im
Texte,
Programmtext
sollen, müssen von Anführungszeichen
(")
eine
die
als
stehen
eingeschlossen
sein. Wenn man
unveränderliche
Zahlen
in
den
Programmtext
schreiben will, kann man auf die Anführungszeichen
ver-
zichten. Beispiel ?WRITE 2 2 ?WRITE 3+5 8 7 Im WRITE-Befehl kann man mehrere durch Kommata getrennte Argumente angeben. Sie
werden
direkt nacheinander ohne
trennende Leerzeichen oder andere Zeichen ausgegeben. Beispiel 7WRITE
"WRITE","MIT","MEHREREN","ARGUMENTEN"
WRITEMITMEHRERENARGUMENTEN ?WRITE "WRITE ","MIT ","MEHREREN WRITE MIT MEHREREN ARGUMENTEN ?
","ARGUMENTEN"
12
Beispiele einfacher Befehle
Der WRITE-Befehl kennt
besondere
Argumente
tierung der Ausgabe. Wir werden später die damit verbundenen
noch
zur Formagenau
auf
Möglichkeiten eingehen. Hier soll
nur der Zeilenvorschub erwähnt werden. Er wird durch ein Ausrufezeichen (!) erzeugt.
Besteht
ein
Argument
des
WRITE Befehls aus einem oder mehreren Ausrufezeichen, so werden genau so viele Zeilenvorschübe erzeugt, wie
Aus-
rufezeichen vorhanden sind. Zeilenvorschübe werden in
MUMPS nie automatisch erzeugt
(es sei denn, es ist eine Bildschirmzeile
vollgeschrie-
ben), sondern müssen immer explizit durch Ausrufezeichen in WRITE-Befehlen angefordert werden. Beispiel 7WRITE "DIESE",!."TESTAUSGABE
ENTHAELT",!!,"ZEILENVORSCH
UEBE" DIESE TESTAUSGABE ENTHAELT ZEILENVORSCHUEBE 9
Jetzt wollen wir uns einem von (fast)
allen
weiteren
wichtigen
Programmiersprachen
Element
zuwenden:
den
Variablen. Variablen stellen das 'Gedächtnis' der Programme dar. Es sind Speicher, die beliebige Werte, z.B. Ergebnisse Berechnungen, aufnehmen
und
aufbewahren
können.
dieser Variablen hat einen eindeutigen Namen,
über
von Jede den
auf den Inhalt (oder Wert) zugegriffen werden kann. Dies geschieht einfach in
der Weise,
daß man den
Variablen an die Stelle eines Ausdrucks oder fehls schreibt, an der der Wert benötigt wird.
Namen der eines
Be-
Beispiele einfacher Befehle Die Namen von Variablen müssen entweder mit einem
Buch-
staben oder einem Prozentzeichen (J) beginnen. Die genden Zeichen
müssen
Buchstaben
oder
13
Ziffern
folsein.
Beispiele richtiger Variablennamen sind: ABC
A123
A1B2C3
JVAR
%
Nicht erlaubt sind: 1AZ
123
NAME-1
VAR.X
Die Zuweisung eines neuen Wertes an eine
Variable
wird
in MÜMPS durch den Befehl SET erreicht. Beispiel ?SET ABC=5 ?
In diesem Beispiel
ist der
Name der Variablen
ihr wird der Wert 5 zugewiesen.
Das
ABC und
Gleichheitszeichen
(=) zeigt die Zuweisung an. Es wird jeweils der Wert auf der rechten Seite
des Gleichheitszeichens der Variablen
auf seiner linken Seite
zugewiesen.
Man beachte hierbei den Unterschied zwischen weisung, die
durch
das
einer
Gleichheitszeichen
wird, und der mathematischen
Aussage,
daß
Zu-
angezeigt zwei
Werte
einander gleich sind. So ist die Aussage 1=1+1 im mathematischen Sinne falsch,
aber »die
Anweisung
stellt einen gültigen Befehl dar und
bewirkt,
SET 1=1+1 daß
der
anderen Befehle der Sprache
(bis
Wert der Variablen I um eins erhöht wird. Wie das WRITE und alle
auf eine Ausnahme, die wir später noch
besprechen
wer-
den), erlaubt auch das SET die Angabe von mehreren Argumenten, die durch Kommata getrennt sind.
14
Beispiele einfacher Befehle
Beispiel ?SET ABC=5,X="HALLO" 7WRITE
"KONTROLLE:",!,ABC,!,X
KONTROLLE: 5 HALLO
Im obigen Beispiel wird gleichzeitig deutlich, Variablennamen benutzt werden, geben. Man beachte KONTROLLE:) in
dabei,
um
daß
Anführungszeichen
deren
wie
die
Inhalt auszu-
Textkonstanten
(HALLO,
eingeschlossen
sind,
während Variablennamen (ABC, X) direkt angegeben werden. Bei der Zuweisung eines Wertes an mehrere Variablen kann man die Klammerform des Variablen A, B, C jeweils
Befehls
benutzen.
Sollen
den
der Wert 1 zugeordnet werden,
schreibt man: Beispiel ?SET 7
(A,B,C)=1
Der SET-Befehl dient zur Zuweisung von Werten
innerhalb
des Programms. Es muß jedoch auch möglich sein, den Wert einer Variablen durch Eingabe am Bildschirm men. Dazu dient der READ-Befehl. Beispiel ?READ EINGABE
zu
bestim-
Beispiele einfacher Befehle Es erscheint kein Prompt,
da
jetzt
eine
15
Eingabe
Bildschirm erwartet wird. Erst wenn ein Text
vom
eingegeben
wurde, meldet sich der Interpreter von MUMPS wieder
mit
seinem Prompt. MEINE EINGABE 7WRITE "DEINE EINGABE WAR:
",EINGABE
DEINE EINGABE WAR: MEINE EINGABE ?
Das oben gezeigte Beispiel macht deutlich, daß ein gabebefehl alleine sehr verwirrend
sein
nicht genau weiß, ob das Programm
kann,
gerade
da
noch
oder ob es auf eine Eingabe wartet. Daher ist
Einman
rechnet es
sinn-
voll, vor einer Eingabe einen Text auszugeben, der
nach
Möglichkeit angibt, welche Eingabe erwartet wird. MUMPS unterstützt diese Vorgehenweise dadurch, daß feste Zeichenfolgen, die
man
dem
READ-Befehl
als
Argument
übergibt, auf das Terminal ausgegeben werden. Beispiel 7READ "WIE GEHT ES DIR ? ",ANTWORT WIE GEHT ES DIR ? GUT 7WRITE "ES FREUT MICH, DASS ES DIR "»ANTWORT," GEHT" ES FREUT MICH, DASS ES DIR GUT GEHT 9
Die Formatierung der
Eingabe
daß die Drucksteuerzeichen,
wird dadurch erleichtert, die
erlaubt sind (z.B. Ausrufezeichen
für für
den
WRITE-Befehl
Zeilenvorschub),
auch als Argument des READ-Befehls zulässig sind.
16
Beispiele einfacher Befehle
Beispiel ?READ "GIB EINE ZAHL EIN ",A,!,"UND NOCH EINE ",B GIB EINE ZAHL EIN 23 UND NOCH EINE 15 ?WRITE "DIE SUMME DER ZAHLEN IST ",A+B DIE SUMME DER ZAHLEN IST 38 7
Das letzte Beispiel zeigt besonders
deutlich,
daß
Argumente des READ-Befehls von links nach
rechts
beitet werden. Besteht ein
einer
Zeichenfolge oder aus
Argument
einem
aus
die bear-
festen
Druckformatierungszeichen,
so wird eine entsprechende Ausgabe erzeugt. Wird dagegen eine Variable angegeben, so wartet der Rechner
auf
Eingabe eines Wertes für diese Variable. Stehen Variablen in einem
READ-Befehl,
die
mehrere
so müssen entsprechend
viele Eingaben erfolgen. In manchen Fällen will man vermeiden, daß eine bestimmte Anzahl von Zeichen in der
Eingabe
Beispielsweise soll die Länge
der
überschritten Eingabe
des
wird. Namens
einer Person auf 20 Zeichen begrenzt werden. Beispiel ?READ "NAME : NAME : ?
",NAME#20
GOETHE, JOHANN WOLFG
Der READ-Befehl in der angegebenen Form erlaubt nur
die
Eingabe von einer vorgegebenen Anzahl von
Da-
Zeichen.
nach wird die Eingabeanweisung abgebrochen. Es hängt vom verwendeten Rechner ab, ob man jetzt noch geben muß oder ob dies automatisch geschieht.
Beispiele einfacher Befehle
17
Alle bis jetzt besprochenen Befehle ermöglichen zwar das Hantieren mit Variablen und Werten, eine wirkliche arbeitung, die von der Maschine schneller und als von Hand durchzuführen ist, hat
noch
Ver-
einfacher
nicht
statt-
gefunden. Die meisten der Verarbeitungsmöglichkeiten
sollen
auch
erst später erklärt werden. Hier wollen wir jedoch schon als ein Beispiel die Funktion $LENGTH erwähnen,
die
es
erlaubt, die Länge einer Zeichenfolge zu ermitteln. Beispiel ?READ "EINGABE ? ",E EINGABE ? MUMPS IST EINE SEHR INTERESSANTE SPRACHE 7WRITE "DIE EINGABE IST ",$LENGTH(E)," ZEICHEN LANG" DIE EINGABE IST HO ZEICHEN LANG ?
In den meisten Programmiersprachen ist der Funktion bekannt. Kurz
gesagt
Begriff
der
wird der Funktionsaufruf
durch einen Wert ersetzt, der anhand der rechnet wird. Im Beispiel wird
Argumente
an die Stelle
be-
der Funk-
tion $LENGTH die Länge der Variablen E gesetzt. In MUMPS beginnen die Namen
von
allen
Funktionen
einem Dollarzeichen ($). Die Parameter werden mern eingeschlossen und
direkt
in
mit Klam-
nach dem Funktionsnamen
angegeben.
Wir haben schon
weiter oben
erwähnt, daß in
einer Be-
fehlszeile beliebig viele Befehle stehen dürfen. Es
muß
nur gewährleistet sein, daß die Zeile nicht mehr als 255 Zeichen enthält. Die Befehle müssen jeweils durch zeichen vom vorhergehenden
Befehl
mindestens getrennt
ein sein.
LeerSie
18
Beispiele einfacher Befehle
werden in der Reihenfolge ausgeführt, in der sie
inner-
halb der Zeile stehen (von links nach rechts). Beispiel ?READ "EINGABE ? ",X WRITE !,"DEINE EINGABE WAR:
",X
EINGABE ? HALLO DEINE EINGABE WAR: HALLO ?
Auch in diesem Beispiel ist wieder zu sehen, daß Zeilenvorschübe immer durch
Angabe eines Ausrufezeichens aus-
drücklich verlangt werden müssen.
Nachdem alle Befehle, die bis
jetzt
behandelt
wurden,
dafür gedacht waren, den Rechner zu bestimmten Verarbeitungsschritten zu veranlassen, wollen wir uns jetzt
mit
dem Befehl beschäftigen, der dem Rechner
der
das
Ende
Arbeit mitteilt. Der einfachste Fall wäre natürlich, wenn man am oder am Terminal einfach den
Strom
ausschalten
Rechner würde.
Diese Vorgehensweise ist
bei den meisten MUMPS-Systemen
nicht sinnvoll, denn man
muß
dem
Rechner
Gelegenheit
geben, die Arbeit zu einem ordnungsgemäßen Ende zu bringen. Dazu dient der HALT Befehl. Beispiel ?HALT Es erscheint jetzt auch kein
Prompt mehr, da der MUMPS-
Interpreter keine Befehle mehr annehmen kann.
Beispiele einfacher Befehle
19
Die weitere Vorgehensweise bei der Beendigung der Arbeit ist wieder sehr stark vom verwendeten Rechner Kleinere Rechner
wird
man
jetzt
ausschalten
während man bei größeren Rechnern, die mehrere unterstützen, im allgemeinen
auch
system die Beendigung der Sitzung mit LOGOFF).
abhängig.
noch
dem
mitteilen
können, Sprachen Betriebs-
muß
(z.B.
20
Zahlen in MUMPS
14 Zahlen in MUMPS und numerische Operationen Die Darstellung von Zahlen in MUMPS ist MUMPS kennt sowohl ganze Zahlen auch Dezimalzahlen (z.B.
recht
einfach.
(z.B. 123 oder -5), als
-12.3*45).
Um
auch
besonders
kleine oder große Zahlen darstellen zu können, wird
man
sich der Exponentialdarstellung von Zahlen bedienen, bei der Zahlen durch das Produkt von
Mantisse
und
Zehner-
potenz angegeben werden. Dabei schreibt man zunächst die Mantisse, dann ein 'E 1 , auf das die ganzzahlige potenz folgt.
Also
wird
man
1.3E-8
Zehner-
anstelle
von
0.000000013 schreiben. Jede dieser Zahlen
heißen numerische Literale. Literale
sind konstante Werte, die fest im Programmtext enthalten sind. Wir wollen
auf
wenn wir Stringliterale
diesen
Sachverhalt zurückkommen,
behandeln.
Betrachten wir einige Beispiele: Beispiele 7WRITE -0.123
(Beispiel 1)
-.123 7WRITE
(Beispiel 2)
1.2300000
1.23 (Beispiel 3)
?WRITE 8.9E-2 .089 ?WRITE
(Beispiel 4)
.12E+2
12 ?
Beim ersten Beispiel stellen wir
fest, daß bei der Aus-
gabe einer Dezimalzahl mit einem Ganzzahlanteil von Null dieser nicht
ausgedruckt
wird.
Angehängte
Nullen
in
Zahlen in MUMPS einer Dezimalzahl werden
21
ebenfalls unterdrückt, wie uns
das zweite Beispiel zeigt. Die Ausgabe einer Dezimalzahl erfolgt - wie auch die interne Dezimalschreibweise und
nie
Darstellung in
immer
in
Exponentialform.
Und
schließlich ist auch die Eingabe einer Dezimalzahl
ohne
die führende Null erlaubt, was uns das
letzte
Beispiel
vermittelt. Nicht zugelassen sind Zahlen der Form E3 oder 1.2E-1.6. Wegen der begrenzten Darstellbarkeit auf einem digitalen Rechner müssen die Zahlen innerhalb festgelegter Grenzen liegen. In MUMPS sind alle
Zahlen aus dem Bereich 1E-26
bis 1E26 und dem negativen Gegenstück einschließlich der Null erlaubt. Zahlen,
die
größer
oder
kleiner
sind,
können nicht mehr dargestellt werden, aber der eine oder andere Hersteller hat den Bereich erweitert. Auch die Genauigkeit, mit der in MUMPS Zahlen
angegeben
werden können, ist bei den einzelnen Herstellern schiedlich. Es müssen
jedoch
berücksichtigt werden. Man kann
mindestens das
neun
leicht
an
unterStellen seinem
eigenen Computer überprüfen. Beispiel ?SET A=4/3
;
DER SCHRAEGSTRICH STEHT FUER DIVISION
7WRITE A,!,$LENGTH(A) 1.333333333333333333 20 ?
Wie ist dieses Ergebnis zu interpretieren? Zunächst wird der Variablen A das Ergebnis der Division sen. Bei 4/3 handelt es
4/3
zugewie-
sich um einen unendlichen Dezi-
22
Zahlen in MUMPS
malbruch, der in
der
internen
einmal abbricht. Das sehen wir
Darstellung
irgendwann
auch, wenn wir
ben. Die Länge der Zahl A, die wir
dann
A ausge-
ausgeben,
ist
die Gesamtlänge der Darstellung (mit Punkt) . Die Anzahl der signifikanten
Stellen
ist
also
in
unserem
Fall
20-1=19. Im nächsten Teil wollen wir
erklären, wie man
mit Zahlen rechnet. Wie in vielen sprachen kann man auch in MUMPS
anderen
in MUMPS
Programmier-
numerische
Operationen
durchführen. In der einfachsten Form versteht man darunter gewöhnlich die Fähigkeit, durch Anwendung einer
der
vier Grundrechnungsarten aus zwei Zahlen eine dritte erzeugen. Man nennt diese
Art
der
Zahlen eine zweistellige (man sagt rische Operation.
Die
Addition Subtraktion
*
Multiplikation
/
Division
Beispiele 7WRITE 12+4 16 7WRITE 12-4 8 7WRITE 12*4 36 7WRITE 12/4 3 ?
auch
Rechenzeichen
folgendermaßen dargestellt: +
Verknüpfung binäre)
werden
in
zu
zweier numeMUMPS
Diese Begriffe sind uns aus
der
läufig. Selbstverständlich können
Zahlen in MUMPS
23
Alltagsmathematik
ge-
wir auch Variablen in
der Berechnung arithmetischer Ausdrücke benutzen : Beispiel H
?SET A=10,B=5 WRITE A," / 10/5
, B , " = ",A/B
=2
Bei der Berechnung
arithmetischer
Ausdrücke trifft man
oft eine Kombination der vier Grundrechenarten an, 4+3*5. Ehe wir in MUMPS ein Beispiel formulieren,
etwa wollen
wir einen Augenblick anhalten und etwas
über
henfolge der Ausführung
Ausdrücken
bemerken.
Bei
die
Reider
obigen Art benutzen wir stillschweigend eine Reihenfolge in der Berechnung, indem wir zunächst die Multiplikation ausführen (ergibt 15) und zu diesem Ergebnis addieren. Kurz und prägnant hat man die
eine
Regel:
vier
'Punkt-
1
rechnung geht vor Strichrechnung . Betrachten wir MUMPS: Beispiel ?WRITE 4+3*5 35 ?
Was ist passiert? Nun,
MUMPS
schweigende Vereinbarung kation, sondern führt
kennt
der
die
Priorität
Berechnung
rechts durch. Es wird also 4 zu
3
Ergebnis mit 5 multipliziert. Als festhalten, daß
MUMPS
Abarbeitung vornimmt. Es
nicht
eine gibt
tion. Ein weiteres Beispiel:
der von
addiert Ergebnis
die
still-
Multiplilinks und
nach dieses
wollen
wir
strikte
links-nach-rechts
keine
bevorzugte Opera-
2t
Zahlen in MUMPS
Beispiel ?SET A=2,B=14,C=5 WRITE B/A+3»C 50 ?
Demnach wird zuerst die Division durchgeführt, dann eine 3 addiert und schließlich dieses Ergebnis mit
5
multi-
pliziert. Möchte man hingegen
das
mathematisch korrekte Ergebnis
erhalten, muß man sich der Klammern bedienen.
Der
Aus-
druck in der Klammer wird zuerst berechnet. Beispiel ?WRITE 4+(3»5) 19 ?
Wir empfehlen, in jedem benutzen. Aus der
Zweifelsfall
Praxis weiß
man,
die
Klammern
daß die
übliche Reihenfolge der Berechnung eines
in
zu
MUMPS
arithmetischen
Ausdrucks gerade bei Anfängern leicht zu Fehlern führt. Zum Ende dieses Abschnitts wollen wir noch zwei
weitere
numerische Operationen vorstellen: \
Ganzzahldivision
//
Restdivision
Die Ganzzahldivision liefert Divisionsergebnis, also das fraktion.
den
ganzzahligen Teil des
Ergebnis
ohne die Dezimal-
Zahlen in MUMPS Die Restdivision liefert den
Rest,
der
übrig
25
bleibt,
wenn man das linke Argument durch das rechte dividiert. Die Wirkungsweise dieser folgendes Beispiel
beiden
klar.
Operationen wird durch
Angenommen
beliebige Anzahl von Tagen in ein
man
möchte
Wochenformat
eine
konver-
tieren. Ganzzahldivision durch 7 liefert dann die Anzahl der Wochen, Restdivision durch 7 liefert die
noch
ver-
bleibenden Tage. Beispiel 7READ "ANZAHL TAGE EINGEBEN ANZAHL TAGE EINGEBEN
",AT
52
7WRITE AT," TAGE ENTSPRECHEN ",AT\7," WOCHEN UND ",AT#7, " TAGE" 52 TAGE ENTSPRECHEN 7 WOCHEN UND 3 TAGE ?
Das sind alle numerischen
Operationen,
die
MUMPS
zur
Verfügung stellt. Dem Leser, der vielleicht schon einmal mit BASIC programmiert hat, wird
auffallen,
keine weitergehenden Funktionen,
wie
etwa
daß das
zieren oder das Radizieren kennt. MUMPS beschränkt
MUMPS Potensich
hier bewußt auf die mathematischen Grundfunktionen, weil die Stärke der Sprache im Bereich liegt.
der
Textverarbeitung
26
Zeichenvorrat und Zeichenketten
1.5 Zeichenvorrat und Zeichenketten 1.5.1 Der grafische Zeichensatz und Stringliterale
Wir haben Zeichenketten in
einer
schon kennengelernt, nämlich
sehr
als
einfachen
Argumente
und READ-Befehle. Wir haben gesehen, daß
Form
der WRITE-
man
diese
Anführungszeichen (") einschließt. Genau genommen die bisherigen Zeichenketten sogenannte deren Werte sich
bei
der
Ausführung
in
waren
Textkonstanten, eines
Programms
nicht ändern. Man nennt diese Art von Zeichenketten auch Stringliterale. Mit diesen wollen wir uns blick
einen
Augen-
beschäftigen.
Naheliegend ist die Frage,
aus
welchen
Zeichen
diese
ASCII-Zeichen,
eines
Literale bestehen können. Das führt uns auf den Begriff der genormten Zeichensatzes, Anhang findet man
ein
der
128
Zeichen
umfaßt.
Im
vollständiges Verzeichnis dieser
Zeichen. Die ASCII-Zeichen lassen sich grob einteilen in zeichen und grafische Zeichen. Auf
der
findet man eine Übersicht über die
95
die
welche Zeichen
in
eingangs
gestellte
Stringliteralen
dürfen. Es sind genau
die
95
Seite
grafischen
chen, die den sogenannten MUMPS-Zeichensatz Kehren wir auf
Steuer-
nächsten
Zei-
darstellen.
Frage
zurück,
verwendet
werden
grafischen
Zeichen
des
MUMPS-Zeichensatzes. Ein Beispiel mag das verdeutlichen. Beispiel 7WRITE
"ABCXYZabcxyzO12789.,:*¡"
MUMPS kennt noch
andere
kleiner oder gleich
(nichtnumerische)
operatoren, die wir im nächsten Kapitel
Vergleichs-
behandeln
wer-
den. Die Vergleichsoperatoren arbeiten
in MUMPS in verschie-
dener Hinsicht anders, als man es vielleicht von anderen Programmiersprachen gewohnt ist. Tatsache zu
nennen,
gleicher Weise wie
daß eine
eine
zunächst
Vergleichsoperation
nennt
nicht
in ver-
liefert
ent-
zu) oder
eine 1
beiden
Zahlen
diese
Boolesche Werte, eine Benennung, die
die
Operation
Vergleich
(Vergleich trifft
(Vergleich trifft zu). Man
ist
arithmetische
wendet werden kann. Denn jeder weder eine 0
Da
auch
Sprachen geläufig ist. Einige Beispiele mögen das verdeutlichen.
aus
anderen
58
Vergleichs- und logische Operatoren
Beispiele ?W 5>2 1
?S A=5,B=10 W B55
dieses Vergleichs ist 1, 110+1 1
?S A="0.5",B=+A W A=B 0
Da es in MUMPS keine Präferenz der Operatoren gibt, wird zunächst die
Vergleichsoperation
durchgeführt
eine 0, weil 5< 10) und daran anschließend von 1 durchgeführt, was zusammen
die
(ergibt Addition
1 ergibt. Das ist noch
Vergleichs- und logische Operatoren alles verständlich, aber wenn man
das
zweite
59
Beispiel
betrachtet fragt man sich unwillkürlich, ob MUMPS eigene Rechenregeln entwickelt hat. Das ist natürlich nicht der Fall und das Beispiel wird sofort verständlich, wenn man sich eine
zweite,
hält: die Abfrage
MUMPS-typische auf
Gleichheit
Eigenart
vor
ist
Stringver-
ein
gleich. Will man numerische Werte vergleichen, auf die
verschiedenen
achten. Denn die
Darstellungsformen
muß
von
wird hier intern
Variable B
Augen man
Zahlen als '.5'
abgespeichert, während A "0.5" als String enthält. Keine Verwirrung wäre entstanden, hätte man gleich
die
nume-
rische Interpretation von A verlangt: W +A=B
hätte
den
Booleschen Wert 1 geliefert.
2.3-2 Logische Operatoren und die logische Interpretation
Aus der Mathematik ist bekannt, daß man Werten rechnen kann. Dieses logischen Operatoren
wird
mit
bewerkstelligt.
mit
Booleschen
den
sogenannten
Ihre
Zeichendar-
stellung sieht in MUMPS folgendermaßen aus: &
der UND Operator
'&
der NICHT-UND Operator
!
der ODER Operator
1
der NICHT-ODER
'
der NICHT Operator.
Dabei ist das Ergebnis einer
!
UND-Operation
wahr, wenn beide Operanden wahr
Operator
genau
(d.h. 1) sind,
Ergebnis einer ODER-Operation wahr, wenn ein oder
dann
und das beide
60
Vergleichs- und logische Operatoren
Operanden wahr sind. Bei dem nachfolgendem Beispiel habe die Variable A den Wert "123" und
die
Variable
B
den
Wert "XYZ". Beispiel ?W A&B 0 ?W A!B 1 1 Die Ergebnisse dieser
beiden
Beispiele
leuchten
noch
nicht ganz ein. Woher weiß MUMPS, welchen logischen Wert die beiden Variablen haben, wo doch beide zunächst mal Strings sind? Die Antwort auf die logische
ein-
auf diese Frage führt uns
Interpretation von Zeichenketten. Ähn-
lich der numerischen Interpretation gibt es dafür genaue Regeln und wenn man es
näher betrachtet, ist
rische Interpretation eines
Strings
der
die nume-
Schlüssel für
die Beantwortung dieser Frage. Um nämlich zur Bewertung eines Strings zu kommen, dessen numerische Interpretation.
nimmt Ist
logischen
man
diese
zunächst eine Zahl
ungleich 0, dann ist die logische Interpretation 1, d.h. wahr. Ist dagegen
die
numerische Interpretation gleich
Null, ist auch die logische
Interpretation
Null,
also
Betrachtet man jetzt das obenstehende Beispiel, so
fin-
falsch.
det man als numerische Interpretation die Zahl 123,
von der
der
Variablen B aber
chend ist die logische Interpretation von von B gleich
0. Dann
pfungen verständlich.
sind
auch die
Variablen
A
0. DementspreA
gleich
1,
logischen Verknü-
Vergleichs- und logische Operatoren Der logische Operator NICHT negiert den
61
logischen
eines Ausdrucks. In unserem Beispiel hätte 'A
Wert
den
Wert
0, 'B den Wert 1. Die beiden verbleibenden Operatoren NICHT-UND und NICHTODER sind für zwei Variablen A und
B
wie
folgt
defi-
niert: A'&B
1
(A&B)
respektive
In der (Programm-) Realität hat man meistens bination aus arithmetischen, logischen operationen. Hierbei gilt wieder keine Bevorzugung
eines
1
A'!B < = = >
zu
Operators
und
eine
Kom-
Vergleichs-
beachten, gibt.
(A!B)
daß
es
Ein
letztes
der Klammern bedienen
muß, um
Beispiel möge das verdeutlichen: Beispiel ?S A="123",B="XYZ" W A 1 " , X W #! ! !?20,"UEBERSCHRIFT",! R "1. ZEILE : ",? 15,Z1,!,"2. ZEILE :",?15,Z2,! Bei der Benutzung des Tabulierungsoperators ist es wichtig zu wissen, das MUMPS der ersten Spalte die Nummer gibt. Daher bewirkt die Angabe von ?1
eine
0
Positionie-
rung in die zweite Spalte. Das genaue Verhalten
der
Formatierungsoperatoren
sich am besten unter Zuhilfenahme der speziellen
läßt Varia-
blen $X und $Y definieren. Diese Variablen werden ständig vom MUMPS-Interpreter auf dem neuesten Stand gehalten.
Ihr
Inhalt
spiegelt
die
124
Die Formatierung der Ausgabe
Position innerhalb einer Seite wieder, in der das
näch-
ste ausgegebene Zeichen geschrieben wird. Hierbei entspricht der Inhalt
von
$Y
Zeile innerhalb der Seite. Die erste
der
Nummer
der
Zeile
erhält
die
Nummer 0, die zweite die Nummer 1 usw. Der Inhalt von $X gibt die Position innerhalb einer Zeile erhält die erste Spalte die Spalten werden in
an.
Nummer 0 und
aufsteigender
Auch
hier
die folgenden
Reihenfolge
durchnum-
meriert. Die beiden speziellen Variablen können an des MUMPS-Programms abgefragt überall dort zulässig, wo
werden.
auch
jeder
Ihre
eine
Stelle
Angabe ist
normale
Variable
stehen darf. Die Wechselwirkung
zwischen
den
Formatierungsbefehlen
und $X bzw. $Y stellt sich wie folgt dar. Der Operator für den Seitenvorschub
(//) erzeugt auf
Drucker einen Vorschub auf den Beginn der nächsten te. Auf dem Terminal wird der Bildschirminhalt
dem Sei-
gelöscht
und der Cursor in die linke obere Ecke positioniert. Die Variablen $X und $Y erhalten beide den Wert 0. Der Zeilenvorschubsoperator
(!)
erzeugt
auf
allen Ge-
räten einen Vorschub um eine Zeile. Die Variable $Y wird um eins erhöht, während $X den Wert 0 erhält. Bei der Positionierung
(?) wird
zuerst
das
Argument ausgewertet. Ist der Wert kleiner dem Inhalt von
$X,
so
wird
die
numerische oder
Operation
ignoriert
(Schreibposition steht schon weiter rechts als wünschte Position). Sonst weit nach rechts
wird
gerückt und
gleich die
die Schreibposition sodabei
der Inhalt
jeweils um eins erhöht, bis $X gleich dem Wert des drucks ist. Hierbei wird immer pretation des Ausdrucks
ge-
die
ganzzahlige
von $X AusInter-
herangezogen.
Bei der Ausgabe eines darstellbaren
(es
gibt
auch nicht-darstellbare - siehe später) wird $X um
eins
erhöht.
Zeichens
Die Formatierung der Ausgabe Im folgenden
sollen
werden. Da die
noch
einige
originalgetreue
des Seitenvorschubs zu
viel
Beispiele
125
angegeben
Darstellung der Wirkung
Platz
beanspruchen würde,
wollen wir uns damit begnügen, den Seitenvorschub die Angabe von (Formfeed)
durch
anzudeuten.
Beispiele ?W #!,$Y," ",$X
1 2 ?F 1=1:1:5 W ?$X+3,"!" !
!
!
!
!
?W // F 1=1:1:3 S X=$X+3 W !?X,X
3 7 11 ?W »Zum Zeilenunterstreichen" S X=$X W ! F I=1:1:X W Zum Zeilenunterstreichen 7 An diesen Beispielen wird deutlich, wie sich die blen $X und $Y
während
der
Ausführung
eines
VariaBefehls
verhalten. Ihr Wert wird nicht etwa erst nach Ausführung des gesamten Befehls verändert, sondern schon Ausführung des jeweiligen
Arguments.
Wenn
nach das
der
darauf
folgende Argument ausgeführt wird, haben sich die Variablen $X und $Y schon verändert. Das letzte Beispiel zeigt eine einfache Methode, um eine (variabel lange) Zeile zu unterstreichen. Dazu merkt man
126
Die Formatierung der Ausgabe
sich in der
Variablen X
die
Position des
letzten ge-
druckten Zeichens der Zeile vorher und schreibt in einer FOR-Schleife X-mal das Unterstreichungszeichen "-".
$JUSTIFY
127
3.6 Die Funktion $ JUSTIFY Die oben
angegebenen
erlauben die genaue
Möglichkeiten Festlegung
dem Ausgabegerät. Für eine gut
zur
Formatierung
der Schreibposition auf lesbare
Ausgabe
werden
jedoch auch noch Möglichkeiten benötigt, einzelne Datenelemente in ihrer Darstellung zu beeinflussen. Hierzu gehören die
rechtsbündige Ausrichtung von Daten-
elementen in Feldern und die
Formatierung
von
numeri-
schen Werten. Diese Operationen
werden
in
MUMPS
der
Funktion
dieser
Funktion
wird von der Anzahl ihrer Parameter gesteuert.
Zunächst
$JUSTIFY ausgeführt. Die Wirkungsweise
von
wollen wir auf den Aufruf mit zwei Parametern eingehen. In diesem Fall wird eine beliebige Zeichenfolge bündig in ein Feld fester Länge zunächst einmal anhand
eingetragen.
rechtsDas
soll
von einigen Beispielen erläutert
werden. Beispiele ?W $JUSTIFY(3.14,7) 3.14 ?W $J("ZEICHENKETTE",5) ZEICHENKETTE ?S X="MUMPS",Y=$J(X,7) W Y MUMPS ?S BLANK=$J (1111, 20) W BLANK, $L(BLANK) 20 7 Wie die Beispiele zeigen, läßt sich der Funktionsname zu $J abkürzen. Der erste Parameter enthält das
darzustel-
128
$JUSTIFY
lende Datenelement. Der zweite Parameter gibt die des Feldes an, in dem die Darstellung
Länge
rechtsbündig
er-
folgen soll. $JUSTIFY erzeugt so viele Seite der Zeichenkette,
Leerzeichen bis
die
auf
der
angegebene
erreicht ist. Wenn die Zeichenkette länger ist angegebene Feldlänge,
wird
sie
nicht
linken
Feldlänge als
die
abgeschnitten,
sondern in ihrer vollen Länge übernommen (siehe 2.
Bei-
spiel) . Das dritte Beispiel
daß
$JUSTIFY
- wie jede andere Funktion auch - nicht nur in
soll
verdeutlichen,
Ausgabe-
befehlen erlaubt ist, sondern in jedem
beliebigen
Aus-
druck. Das wird im vierten Beispiel für
eine
etwas
zweckent-
fremdete Benutzung der Funktion ausgenutzt. In der
dar-
gestellten Weise lassen sich leicht Zeichenketten erzeugen, die nur Leerzeichen enthalten. Die drei-parametrige Form von $JUSTIFY kann als Erweiterung der zwei-parametrigen ist für numerische
Form
Datenelemente
angesehen vorgesehen
werden. Sie und sorgt
für deren Formatierung. Der dritte Parameter gibt die Anzahl der zu Nachkommastellen an. Falls
erforderlich
erzeugenden
wird der nume-
rische Wert des ersten Arguments gerundet oder mit Dezimalpunkt und Nachkommastellen versehen. Das Ergebnis der Umwandlung wird
wie
bei
der
zwei-parametrigen
rechtsbündig in das Feld eingesetzt.
Form
fcJUSTIFY Auch hier sollen
einige
Beispiele
die
129
Benutzung
der
Funktion verdeutlichen. Beispiele ?W $J(3.14,7,4) 3.1400 ?W $J(3.14,7,0) 3 ?W $J(20.87,5,1) 20.9 ?W $J(0.5,6,3) 0.500 ?S ZAHL= 308.297,RND=$J(ZAHL,0,2) W RND 308.30 ?
Die Beispiele zeigen
noch
einige
weisen der $JUSTIFY-Funktion
in
wichtige VerhaltensSonderfällen. Wenn der
dritte Parameter gleich 0 ist, werden
keine
Nachkomma-
stellen und auch kein Dezimalpunkt erzeugt. Führende Nullen werden unterdrückt. Jedoch haben Zahlen, deren Betrag kleiner
als eins
ist,
eine Null
vor dem
Dezimalpunkt. Im letzten Beispiel wurde die Funktion - nicht zum
rechtsbündigen
nur
Ausrichten -
zum
Runden
benutzt.
Von
dieser einfachen Rundungsmöglichkeit kann natürlich auch im Laufe von Berechnungen Gebrauch gemacht werden.
130
Zeichendarstellung und
Konvertierungsfunktionen
3.7 Zeichendarstellung und Konvertierungsfunktionen Wir haben schon bei der Besprechung
der
Formatierungs-
operationen von nicht-druckbaren Zeichen gesprochen. Was hat es damit auf sich? Um das erklären zu können, wollen wir erst einmal auf den ASCII-Code
eingehen.
Da digitale Rechner in ihrem Speicher stellen können, wird bei staben jedem Zeichen
der
nur
Zahlen
Abspeicherung
dar-
von
Buch-
des verfügbaren Zeichensatzes eine
Zahl zugeordnet, die dieses
Zeichen
bei
der
internen
Verarbeitung repräsentiert. Diese Zuordnung ist im Prinzip frei wählbar. Jedoch muß
man sich auf
chencodes einigen, wenn man
Texte
oder
gleiche ZeiProgramme
von
einem Rechner zu einem anderen übertragen will. Ein solcher Code, der international
benutzt
wird,
ist
der ASCII-Code, dessen vollständige Zuordnungstabelle Anhang zu finden ist.
Die
Sprachdefinition
setzt voraus, daß die druckbaren Zeichen dargestellt werden. Daher wollen auch stillschweigend annehmen, daß
der
von
im
wir
im
MUMPS
ASCII-Code im
weiteren
ASCII-Code
zur Zei-
chendarstellung benutzt wird. Die Abspeicherung von Zeichencodes Abspeicherung von numerischen
ist
Werten,
nicht also
mit
der
Zahlen, in
MUMPS zu verwechseln. Zahlen werden in
MUMPS
als
chenketten abgespeichert. Jede
einer
Zahl wird
Ziffer
Zei-
dabei durch ihren ASCII-Code repräsentiert. Die Ziffer 0 würde zum Beispiel
eine
interne Speicherzelle
in der der Wert 48 (Code für das Zeichen "0")
belegen, abgespei-
chert ist. Entsprechend würde die Zahl 153 in drei Speicherzellen abgelegt werden, die die Zahlen 49, 53 und 51 enthalten. Bei der
Betrachtung
fällt auf, daß sie 128
der
Zuordnungstabelle
im
Anhang
Positionen enthält. Für die nor-
Zeichendarstellung und Konvertierungsfunktionen
131
malen grafischen Zeichen (siehe Kapitel 1) werden jedoch nur 95 Positionen benötigt. Die
restlichen
33
Zeichen
stehen für Steuerungsfunktionen zur Verfügung. Mit ihnen können solche Funktionen wie Zeilenvorschub, Signal oder Löschen
des
akustisches
Bildschirmes durchgeführt wer-
den. Diese Positionen in der Tabelle werden nicht-grafische oder nicht-darstellbare Zeichen genannt. Wenn der Code für ein
solches Zeichen auf
ein Terminal
ausgegeben wird, bewirkt er - abhängig vom Terminaltyp gar nichts oder eine Zustandsänderung des Terminals. wird jedoch kein sichtbares Zeichen auf
dem
Es
Bildschirm
dargestellt. Da diesen Codes
keine
darstellbaren Symbole
zugeordnet
sind, können sie auch nicht in einem Stringliteral geben werden. Es werden also
andere
Möglichkeiten
angezur
Erzeugung dieser Zeichen benötigt. MUMPS stellt hier
besondere
Funktionen
zur Verfügung,
die aus dem ASCII-Code eines Zeichens das Zeichen selbst erzeugen und die ein Zeichen in
dessen
ASCII-Code
um-
wandeln. Die Funktion heißen $CHAR und $ASCII. Die Funktion $CHAR (abgekürzt $C) kann ein oder
mehrere
Argumente haben. Sie erzeugt einen String, bei dem jedes Argument als ASCII-Code
eines
Zeichens
und in dieses Zeichen transformiert
angesehen wird
wird.
spiele mögen das verdeutlichen: Beispiele ?WRITE
$CHAR(77,85,77),$C(80),$C(83)
MUMPS ?W $C(7) (Es wird ein akustisches Signal ausgegeben)
Einige
Bei-
132
Zeichendarstellung und
Konvertierungsfunktionen
?S VAR="Vorschub auf"_$C(13,10)_"neue Zeile" W VAR Vorschub auf neue Zeile ?
Die Beispiele verdeutlichen noch
einmal,
daß
mit
der
$CHAR-Funktion sowohl grafische als auch nicht-grafische Zeichen erzeugt werden können. Wie das
dritte
Beispiel
zeigt, können mit dieser Funktion auch Steuerzeichen
in
Variablen abgelegt werden. Werte kleiner als 0 werden in den leeren String abgebildet, während die Reaktion auf sind, von der Implementierung
Werte, die größer als 127 abhängt.
Das Gegenstück zu der Funktion $CHAR
ist
die
Funktion
$ASCII. Sie wandelt ein Zeichen in seinen ASCII-Code um. Auch hier sollen einige Beispiele angegeben werden. Beispiele 7WRITE $ASCII("K") 75 ?W $A("STRING") 83 ?W $A("") -1
?W $A("STRING",3) 82 ?W $A("STRING",10) -1
?W $A(28,2) 56 ?W $A($C(122)) 122
Zeichendarstellung und Konvertierungsfunktionen Der Name der Funktion $ASCII
kann zu $A
133
abgekürzt wer-
den. Es gibt zwei Schreibweisen für den Funktionsaufruf. Bei Aufruf der Funktion erste Zeichen des
mit
einem
Argumentstrings
Argument
wird
in seinen ASCII-Code
umgewandelt. Ist das Argument der leere String, so -1
das wird
zurückgegeben.
Bei der Schreibweise mit zwei Argumenten wird als
zwei-
tes Argument angegeben, welches Zeichen des ersten Argumentes umgewandelt werden soll. Auch hier
ist
das
Er-
gebnis - 1 , wenn das angegebene Zeichen nicht existiert. Das vorletzte Beispiel zeigt wieder nicht zwischen Zahlen und während das letzte
einmal,
Zeichenketten
Beispiel
noch
daß
MUMPS
unterscheidet,
einmal
verdeutlicht,
daß sich die Funktionen $A und $C gegenseitig
aufheben,
also zueinander invers sind. MUMPS kennt auch noch einen zweiten Weg
der
von Zeichen in den zugehörigen Code und
umgekehrt,
sich bei Ein-
läßt.
und
Ausgaben
verwenden
Umwandlung der
Zunächst
wollen wir die Ausgabe anhand von Beispielen betrachten: Beispiele 7WRITE »65,»66 AB ?S X=$A("A") W «X+32 a ?W
"Einfache",«10,"Bildschirmsteuerung"
Einfache Bildschirmsteuerung ? Wie die Beispiele zeigen, wird
die
erzwungen, daß ein WRITE-Argument mit
Umwandlung einem
dadurch
Stern
(*)
13^
Zeichendarstellung und
Konvertierungsfunktionen
beginnt. Der Wert des Ausdrucks ASCII-Code eines Zeichens
nach dem Stern wird als
interpretiert und das Zeichen
wird ausgegeben. Also ist in diesem
Fall
die
Schreib-
weise WRITE *X äquivalent mit der Schreibweise WRITE $CHAR(X) Jedoch ist
- insbesondere
Befehlen - die erste sichtlicher
bei
komplizierteren
Scheibweise
einfacher
WRITE-
und
über-
anzuwenden.
Auch der READ-Befehl kennt die Schreibweise, bei der ein Argument mit einem Stern eingeleitet wird. Hier wird ein einzelnes Zeichen von dem aktuellen
Gerät
gelesen
sein ASCII-Code in die dem Stern folgende Variable
und ein-
getragen. Auch hier einige Beispiele: Beispiele READ "JA (J) ODER NEIN (N) ? R
",*JN
»STATUS,*X,*Y
R *X: 5 Wie die Beispiele
zeigen,
gleichberechtigt mit
sind
anderen
die
'Stern'-Argumente
Argumenten
des
fehls. Für jedes Stern-Argument wird genau eingelesen und
dessen
ASCII-Code
in
READ-Be-
ein
die
Zeichen
angegebene
Variable übertragen. Auch hier ist die Angabe eines Timeouts erlaubt. Erfolgt keine Eingabe innerhalb der durch den Timeout
angegebe-
Zeichendarstellung und Konvertierungsfunktionen nen Zeit, wird der Variablen $TEST auf 0 gesetzt. Wurde
der Wert -1 zugewiesen und ein
Timeout
angegeben
eine Eingabe während dieser Zeit gemacht, so wird auf 1 gesetzt. Wenn kein
135
Timeout
angegeben
und $TEST
wurde,
so
wird auch $TEST nicht verändert.
Zum Abschluß des Kapitels wollen
wir noch auf eine bei-
spielhafte Anwendung von nicht-druckbaren
Zeichen
ein-
gehen. Hier bietet sich die absolute Cursorsteuerung von Bildschirmen an. Diese Funktion dard-MUMPS abgedeckt und
muß
wird daher
nicht auf
von
Stan-
Programmebene
realisiert werden. Leider unterscheiden sich die Steuercodes verschiedener Terminaltypen sehr stark. Daher können wir hier nur beispielhafte Befehlssequenzen vorstellen, die je nach Terminaltyp angepaßt werden müssen. Beispiel ¡STEUER ; MODUL ZUR BILDSCHIRMSTEUERUNG !LZ ; LOESCHE ZEILENINHALT | W «126,«15 Q ¡LB ; LOESCHE BILDSCHIRMINHALT ! W # Q ¡PC ; POSITIONIERE CURSOR AUF (%X,%Y) i W «126,«17,»%X,»iY Q ¡PIEP ; AKUSTISCHES SIGNAL I W »7 Q Die Funktionen dieses Moduls werden durch Unterprogrammaufrufe (z.B. DO LZ~STEUER) wird die Bildschirmsteuerung
angestoßen.
In
der Praxis
Laufzeitgründen
mei-
stens etwas anders durchgeführt, jedoch bleibt das
oben
angegebene Prinzip erhalten.
aus
136
Zeichendarstellung und
Konvertierungsfunktionen
Bei der Verwendung von Sonderzeichen zur Bildschirm- und Druckersteuerung ist besondere Vorsicht geboten, wenn im gleichen Programm die speziellen
Variablen
$X
und
$Y
verwendet werden sollen. Der MUMPS-Interpreter kann
im
allgemeinen nicht erken-
nen, ob ein Zeichen, das zu einem Peripheriegerät geben wird, dort dargestellt wird
und
damit
chenposition ändert oder ob das Zeichen rungszwecken herangezogen wird. daß $X und $Y
nach
der
Daher
Ausgabe
nicht mehr die richtigen Werte
nur
ausge-
die zu
ZeiSteue-
ist zu erwarten,
eines
Steuerzeichens
enthalten.
Wir empfehlen daher, in einem Programm entweder nur
die
von MUMPS bereitgestellten Formatierungsoperationen
(//,
!, ?) in Verbindung mit $X
und
Steuerungsoperationen
Sonderzeichen
mit
$Y
zu
verwenden
und dabei $X und $Y nicht zu verwenden. Auf keinen sollte man sowohl von Sonderzeichen
oder
durchzuführen Fall
als auch von $X und
$Y Gebrauch machen. D a der Tabulierungsoperator
(?)
die spezielle Variable
$X benutzt, gilt für seinen Gebrauch das gleiche wie für den Gebrauch von $X.
c ^ ^
Die sinnvolle Verwendung von MUMPS
137
Die sinnvolle Verwendung von MUMPS
Wir haben bereits im ersten daß es bis heute
keine
Kapitel
wirklich
davon
gesprochen,
universelle
miersprache gibt. Jede Sprache ist
für
Program-
bestimmte
gabengebiete besser und für andere schlechter
Auf-
geeignet.
Diese Feststellung gilt natürlich auch für MUMPS. Um die Entscheidung zu erleichtern,
bei
welchen Problemen die
Sprache sinnvoll eingesetzt werden kann, wollen wir im folgenden mit anderen
bekannten
Programmiersprachen
vergleichen und ihre Vor- und Nachteile Zunächst zu einem Punkt, der bei der
aufzeigen.
Programmierung
MUMPS sehr schnell auffällt: Die Entwicklung von Programmen ist
viel
Entwicklung von
schneller
Programmen
durchzuführen
in
sie
einer
in
MUMPSals
die
compilierenden
Sprache wie zum Beispiel PASCAL, FORTRAN oder COBOL. Die geringe Entwicklungszeit ist
nur
vergleichbar
mit an-
deren interpretativen Sprachen wie BASIC oder APL. Bei interpretativen
Sprachen
ist
Suche und Beseitigung von Fehlern
im sehr
durchzuführen als in compilierenden. sofort ausgetestet
werden,
allgemeinen
während
viel
einfacher
Änderungen zum
die
können
Beispiel
in
PASCAL erst eine erneute Compilierung erforderlich wird, was den Test verzögert. Meistens Lauf eines 'Linkage derlich, der erst
Editor das
1
wird
sogar
noch
der
genannten Programms erfor-
fertige,
ladefähige
Objektmodul
erstellt. Diesem
offensichtlichen
Sprachen steht jedoch
Vorteil
von
interpretativen
ein schwerwiegender Nachteil ent-
gegen. Da die Abspeicherung der Programme
in
der
Form
138
Die sinnvolle Verwendung von MUMPS
erfolgt, in der sie eingegeben
werden,
kann
ihre
deutung erst zur Zeit der Ausführung analysiert Das ist nur mit einem relativ hohen
Be-
werden.
Rechenaufwand
mög-
lich. Das wird besonders deutlich,
wenn
man
die
einer Programmschleife betrachtet. Bei renden Sprache wird zum Zeitpunkt der
Ausführung
einer
compilie-
Compilierung
der
Quellprogrammtext analysiert und in die Maschinensprache transformiert. Die Ausführung
kann
Geschwindigkeit erfolgen.
Gegensatz
einem MUMPS-Programm bei
Im jedem
nun
mit
maximaler
dazu
Durchlauf
muß
bei
der Schleife
der Quellprogrammtext neu analysiert werden. Die Folge dieser
Arbeitsweise
MUMPS-Programme um ein
ist, daß rechenintensive
Vielfaches
die entsprechenden Programme miersprache. Bei einem
in
langsamer laufen als einer anderen Program-
an der Universitätsklinik
furt durchgeführten Vergleich ergaben sich die
stens so gering, daß
Benutzer
sie
vom
werden. Diese Programme warten sehr
Unterschiede
dazu
um die Faktoren 10 bis 50. Im Gegensatz dialogorientierten Anwendungen
Frank-
sind
bei
Verzögerungen oft
nicht auf
mei-
bemerkt Ein-
und
Ausgabeoperationen. Daher fällt die reine Verarbeitungszeit im Vergleich zur Gesamtlaufzeit kaum ins Gewicht. Die interpretative Verarbeitung von MUMPS
hat
einer anderen Eigenheit der Sprache geführt:
noch Die
zu
abge-
kürzte Schreibweise von Befehls- und Funktionsnamen. Sie erklärt sich aus dem Wunsch, möglichst viel Programmtext in einem begrenzten Speicherbereich unterzubringen. weiterer Vorteil dieser
Schreibweise
liegt
Ein
darin, daß
MUMPS-Programme sehr schnell und mit geringem Aufwand am Terminal zu schreiben sind. Hat man jedoch erst einmal das Programm kann sich die
eingegeben,
enge, unübersichtliche Schreibweise
so
nega-
Die sinnvolle Verwendung von MUMPS
139
tiv auswirken. Die Programme sind nur noch sehr schlecht lesbar und daher auch nur schlecht wartbar,
sofern
sie
nicht sehr diszipliniert programmiert sind. Bei einigen großen Anwendern von
MUMPS hat man das oben
dargestellte Problem auch erkannt und
eine
Lösung
Form
mit
ge-
funden. Die Programme werden in gut
lesbarer
vielen
Kommentaren eingegeben. Zusätzlich existieren Programme, die die gut lesbaren
Programmtexte
kompakte Form mit abgekürzten mentare
in
eine
Befehlen
möglichst
und
ohne
Kom-
komprimieren.
Der Nachteil dieses Verfahrens liegt
darin,
daß
jetzt
doch wieder ein Transformationsprogramm notwendig
wird,
das den ursprünglichen Quelltext eines Programms in eine ausführbare Form überführt.
Damit
wird
natürlich auch
wieder die Entwicklungszeit von Programmen Hier wird also ein ursprünglicher
verlängert.
Vorteil
der
Sprache
aufgegeben, um einen Nachteil zu kompensieren. Ähnliche Bemerkungen gelten für den Einsatz ren. Sie werden Eingabe und
bei
den
compilierenden
Veränderung
Interpretative Sprachen
des wie
von
Sprachen
Quellprogramms MUMPS
Editozur
benötigt.
enthalten
meistens
schon als Sprachelemente die Befehle, die zur Erstellung und Veränderung von Programmen erforderlich sind. Daher kann bei den meisten MUMPS-Systemen auf den Editor verzichtet werden. Der
Benutzer
weniger Befehle kennen und wird entsprechend
die
muß
auf
Bedienung
diese des
Weise Systems
vereinfacht.
Es hat sich jedoch herausgestellt, auf den Komfort eines Editors nicht
daß
viele
verzichten
da die Editoren meistens einen viel größeren umfang haben als die in tenen eher einfachen
vielen
Benutzer
MUMPS-Systemen
Editierungsfunktionen.
wollen,
Funktionsenthal-
140
Die sinnvolle Verwendung von MUMPS
Aus diesem Grund wurden in viele
MUMPS-Systeme
lich noch Editoren aufgenommen. Oft sind sie
zusätz-
ihrerseits
auch wieder MUMPS-Programme. Wenn der MUMPS-Interpreter beitet, muß er auf der
als
stand alone
Sprachebene
auch
System ar-
die
Elemente
bereitstellen, die bei den üblichen Betriebssystemen von der sogenannten ' job
control
language 1
(JCL) abgedeckt
werden. Da diese Befehle in die Sprache
integriert
sind,
sind
sie genauso aufgebaut wie die anderen Befehle der che. Der Benutzer
hat es
hier
nur mit
Spra-
einem einzigen
geschlossenen System zu tun, das viel einfacher
zu
er-
lernen ist als die vielen verschiedenen Sprachen anderer Rechner. Jedoch zeigt sich hier eine ähnliche Entwicklung wie bei den Editoren. Die in
die
Sprache
rungsbefehle bieten nur einen Komfort. Daher
werden
integrierten
vergleichsweise
spezielle
Steuegeringen
Dienstprogramme
stellt, die den Benutzer bei der Bedienung
des
er-
Systems
unterstützen. Genau betrachtet wird er damit jedoch
wieder
mit
jetzt
aus
Aufrufen
von
MUMPS ist eine der wenigen Sprachen,
die
international
einer JCL
konfrontiert,
Dienstprogrammen
die
auch
besteht.
standardisiert sind. Das schafft den großen Vorteil, daß MUMPS-Programme, die auf
einem
beliebigen Rechner ent-
wickelt wurden, auf andere Rechner übertragbar sind. Leider mußten auch
im
Standard
anderen standardisierten Sprachen
noch, auch,
lagenspezifische Funktionen und Parameter werden. Jedoch geht bei MUMPS
die
wie
bei
allen
bestimmte
an-
offengelassen
Standardisierung
vieler Hinsicht weiter als bei den anderen Sprachen.
in
Die sinnvolle Verwendung von MUMPS So wurden auch die Funktionen zur
Ein/Ausgabe
141
und
zur
Datenhaltung genau festgelegt. Es ist vom Sprachkonzept vorgesehen, daß alle gen zur Ein- oder
Ausgabe
von
Daten
definiert sind. Daher ist auch hier
Anweisun-
geräteunabhängig
die
leichte
Über-
tragbarkeit von Programmen gewährleistet. Aber auch bei dieser Befehlsgruppe kann sierung nur bis
zu
einem
gewissen
die
Grad
Standardidurchgeführt
werden. In MUMPS liegt diese Grenze bei der Beschränkung auf Geräte, die im Zeilenmodus arbeiten, also nur Zeilen nacheinander darstellen können. Wenn man die
Fähigkeiten
eines
Datensichtgerätes aus-
nutzen und mit Bildschirmmasken arbeiten will, im
MUMPS-Programm
selbst
festlegen. Damit wird auf
bestimmte
die
muß
man
Bildschirmsteuerzeichen
die Verwendbarkeit von Programmen eingeschränkt.
Hier
bleibt es wieder der Disziplin des Programmierers
Sichtgerätetypen
über-
lassen, die Programme so zu schreiben,
daß
auf eine andere
sind. Gewöhnlich
Umgebung
konzentriert man die spezielle MUMPS
umzustellen
gerätespezifischen
sie
leicht
Parameter
auf
Ein/Ausgabemodule.
besitzt
herausragende
keiten. Das fängt schon verwendete Datentyp
die
damit
Textverarbeitung
wie Such-
an,
daß
Zeichenkette
ist. Dann stellt die Sprache Folgt-, Enthält-,
Textverarbeitungsmöglichder
spezielle
Operatoren
Pattern-match, und
allgemein
variabler
Länge zur
Konkatenation,
Teilstringoperatoren
zur
Verfügung. Die Ausrichtung der
Sprache
zur
Textverarbeitung
wird auch dadurch verdeutlicht, daß es nur arithmetische Operatoren gibt. es nie beabsichtigt war, mit
Hier der
mathematische Probleme zu lösen.
hin
grundlegende
wird deutlich, daß
Sprache
komplizierte
142
Die sinnvolle Verwendung von MUMPS
Durch das Variablenkonzept
und
die $ORDER-Funktion ist
ein alphanumerischer Sort gleich in
die
griert. Das macht spezielle aufwendige wie sie in anderen Systemen Vorsicht ist hier nur bei
üblich
Sprache
inte-
Sortierprogramme,
sind,
überflüssig.
der Verwendung von Zahlen mit
führenden Nullen geboten, da sie nicht als
Zahlen
son-
dern als Text einsortiert werden. Das Konzept der
Datenhaltung mittels globaler Variablen
besticht durch seine Einfachheit und
durch
seine
Kom-
patibilität mit den lokalen Variablen. Die konsequente Benutzung
von
Zeichenketten
variabler
Länge verspricht eine sehr gute Ausnutzung des zur fügung stehenden Speicherplatzes.
Aber
auch
hier
Verist
Vorsicht geboten, da bei bestimmten Anwendungsfällen die in MUMPS üblichen
Feldtrennzeichen
als die Benutzung
von
variablen
mehr Platz belegen, Feldlängen
einsparen
kann. Eine weitere Restriktion der
Variablenstruktur
in der Länge von Zeichenketten, chen hinausgehen darf.
besteht
die nicht über 255 Zei-
Dadurch müssen teilweise mehrere
Zeichenketten benutzt werden, wo aus logischer Sicht nur eine einzige erforderlich gewesen wäre. Leider enthält die Datenhaltungskomponente einige Grundfunktionen
von
Datenbanksystemen.
daher nur sehr schwer möglich, eine lisieren, die allen
von MUMPS nur
Datenbank
Es zu
ist rea-
Anforderungen an moderne Datenbank-
systeme genügt. Ein Hindernis ist dabei schon
die
beschränkte
Verwen-
dungsmöglichkeit von Sperren. Z.B. ist es nicht möglich, eine Sperre anzufordern,
ohne
angeforderten Sperren wieder
gleichzeitig alle vorher
freizugeben.
Es gibt außerdem kein Sprachmittel, um zu gewährleisten, daß Änderungen, die parallel in mehreren Globals gemacht
Die sinnvolle Verwendung von MUMPS werden, entweder komplett
oder
führt werden. Wenn während der
überhaupt
nicht ausge-
Änderungen
der
oder das Programm ausfällt, werden sie in bals schon durchgeführt noch ihren alten
sein,
während
143
Rechner
manchen andere
Inhalt haben (Stichwort:
Glo-
Globais
Transaktions-
konzept) . Bei dieser Kritik sollte man jedoch bedenken, daß in den wenigsten Programmiersprachen
eine
Datenhaltungskompo-
nente integriert ist.
Eine weitere Eigenart von MUMPS, die stark von anderen
üblichen
die
Sprache
sehr
Sprachen unterscheidet,
ist
die Verwendung nur eines einzigen Datentyps. Damit kann darauf verzichtet werden, wie in den compilierenden Sprachen
jeder
Variablen
Datentyp zuzuweisen. In
MUMPS
kann
beliebiger Weise
interpretiert
genau
jede
werden.
meisten einen
Variable Die
in
jeweilige
Betrachtungsweise hängt nur von dem Kontext ab,
in
dem
die Variable verwendet wird. Aber auch dieses Konzept bietet nicht nur Vorteile. Eine Sprache mit strenger Typbindung fordert von jeder Variablen, die verwendet werden soll, daß
sie
vorher
genau
deklariert wird. Daher können Fehler, die durch falsches Schreiben eines Variablennamens einer Variablen an
falscher
oder
durch
Stelle
Verwendung
entstehen,
automa-
tisch erkannt und an den Programmierer gemeldet werden. Dagegen erlaubt MUMPS die Verwendung von Variablen vorhergehende Deklaration. Wenn
jetzt
der
Variablen falsch geschrieben wird oder in sammenhang gebraucht wird,
besteht
Name falschem
ohne einer Zu-
für den Interpreter
keine Möglichkeit, diesen Fehler zu erkennen. Ähnliche Überraschungen kann man erleben, wenn in der Sprache
vorgesehenen
Möglichkeiten
man
die
zur Selbst-
144
Die sinnvolle Verwendung von MUMPS
modifikation von Programmen ausnutzt. Hier können datenabhängige Fehler zur Laufzeit auftreten,
die
nur
sehr
schwer zu finden sind. Solche Programme sind in den meisten überschauen und daher
Fällen
schwer
zu
auch schwer wartbar. Andererseits
können diese Sprachelemente in der Hand erfahrener
Pro-
grammierer wertvolle Hilfsmittel sein. MUMPS bietet durch das Unterprogrammaufrufs
einfache
(oder, was
Konzept weniger
des
globalen
empfehlenswert
ist, des globalen GOTO) die Möglichkeit, auch auf nen Rechnern
fast
beliebig
große
klei-
Programmsysteme
zu
schaffen. Es ist ohne Schwierigkeiten möglich, von einem Programmsystem ein anderes
als
Unterprogramm aufzurufen. Daher
lassen sich in MUMPS sehr gut
einzelne
standardisierte
Programmpakete entwickeln, die später je nach Bedarf
zu
größeren Systemen kombiniert werden können. Zusammenfassend läßt sich sagen, daß die Verwendung
von
MUMPS überall dort sinnvoll ist, wo mit
vergleichsweise
geringem Aufwand Anwendungen
werden
aufgebaut
die zwar hohe Ansprüche an Datenhaltung
und
sollen,
Datenmani-
pulation stellen, bei denen es jedoch nicht auf
höchste
Schnelligkeit der Programmausführung ankommt. Die che eignet sich einerseits durch ihre kompakte für kleine Programmsysteme, erstellt werden. Andererseits dardisierte Funktionsumfang
die
innerhalb
erlaubt auch
der
den
gute Strukturierung und Programme achtet.
sorgfältige
man
Struktur
kurzer Zeit große stan-
Aufbau
Anwendungen mit langer Lebensdauer, wenn
Spra-
größerer auf
Dokumentation
eine der
4. Die Struktur der Variablen 4.1 Indizierte Variablen
Es ist gelegentlich sinnvoll, eine Anzahl von verwandten Variablen in einer
einzigen
zufassen. Man nennt
diese
neuen
Variablen zusammen-
Variable
eine
'indizierte'
Variable, weil der Index den Inhalt der einzelnen der Variablen spezifiziert. drei Variablen M, T, A
Beispielsweise habe man die
mit dem jeweiligen
gen", "Tag" und "Abend". Um lichen Namen
(etwa
T)
Teile
sie
unter
Inhalt "Mor-
einem
anzusprechen,
einheit-
schreibt
T(1)="Morgen", T(2)="Tag" und T(3)="Abend". Das der indizierten Variablen ist
in
vielen
man
Konzept
anderen
Pro-
grammiersprachen geläufig und hat in MUMPS eine weitreichende Bedeutung. Es können mehrere durch Kommata getrennte
Indizes
ver-
wendet werden. Die Anzahl ist insofern begrenzt, als die Länge aller ausgewerteten Indizes plus Indizes plus die Länge des
die
Anzahl
der
Namens der Variablen 63 Zei-
chen nicht übersteigen darf. Der einzelne Index
besteht
aus einem allgemeinen Ausdruck, kann also beispielsweise ein Stringliteral
("NAME"),
ein
numerisches
(234), eine gewöhnliche (XZY) oder eine (auch indizierte Variable (X(V(5))),
sowie
Literal mehrmals)
schließlich
eine
Funktion ($L) sein. Nicht erlaubt ist die Verwendung des Leerstrings als Index. Für den Aufbau der Namen gilt das bei den nichtindizierten Variablen Gesagte Einige Beispiele verdeutlichen
den
entsprechend.
Aufbau
indizierter
Variablen: A(1)
A(1,2,3,4)
NAME(X)
NAME(X,2)
NAME(NAME(NAME(9)))
NAME("Name","Vorname")
ORT("D-6000 Ffm")
ZAHL(1.5E3)
NAME(X(2))
L($LENGTH(Y))
146
Indizierte Variablen
Aus Gründen der
Übertragbarkeit
von
Programmen sollte
man noch folgendes beachten: Die Länge eines Index sollte 31 Zeichen nicht übersteigen. Der Index selbst sollte aus der Menge des grafischen Zeichensatzes bestehen. Bei numerischen Indizes sollten
nur
Zahlen benutzt werden,
deren Länge 9 Ziffern nicht übersteigt. Bei Benutzung von indizierten Variablen ergibt sich eine Reihe von Vorteilen, insbesondere in Verbindung mit
dem
FOR-Befehl. Wollte man etwa 10 Werte über den Bildschirm einlesen, so ist folgender MUMPS-Code sehr vorteilhaft: Beispiel ?F0R 1=1:1:10 READ !,»Eingabe: ?
»,R(I)
In R(1) bis R(10) stände dann
der
Wert. Auch bei
der Ausgabe
von
Konstruktion hilfreich sein.
jeweils
eingelesene
Text kann
eine solche
Die Variable T(I) enthalte
die oben angegebenen Werte. Beispiel ?F0R 1=1:1:3 WRITE "Guten ",T(I),! Guten Morgen Guten Tag Guten Abend 7 Für die bisher
betrachteten
indizierten Variablen zusammen den Namen 'lokale' Variable.
(nichtindizierten) und die verwendet
man
in MUMPS
Die Datenstruktur
147
42 Verschiedene Interpretationen der Datenstruktur Es gibt zwei grundsätzliche
Interpretationsmöglichkeiten
der in MUMPS verwendeten Datenstruktur: als Feldstruktur oder als Baumstruktur. Wir wollen auf Abschnitt eingehen und
dabei
die
beide
in
diesem
begrifflichen Unter-
schiede aufzeigen. Angenommen, es werden drei Merkmale mittelt: die Körpergröße
(in
(in [kp]), sowie das Alter sinnvoll, die Werte
in
von
[cm]),
(in
einer
Patienten
er-
das Körpergewicht
Jahren).
Es
erscheint
Tabellenform zusammenzu-
stellen. Koerpergroesse
Gewicht
Alter
92
36
Nr. 1
175
2
163
51
3 4
180
82
57 28
140
45
12
Man nennt eine Feld. In den
solche Anordnung ein Zeilen
stehen
eines Patienten, während in
(zweidimensionales)
jeweils den
die
Spalten
aller untersuchten Patienten zu finden die auf diese Art erhobenen Daten in Variable (etwa PAT(I,J))
Ausprägungen die
sind. einer
unterbringen.
Merkmale Man
kann
indizierten
Dabei steht der
erste Index I für den i-ten Patienten, der Index
J
für
die Merkmale. In PAT(2,2) steht das Gewicht des 2. Patienten, in PAT(4,3) das Alter des 4. Patienten.
118
Die Datenstruktur
In den wichtigsten
höheren
Programmiersprachen
findet
man dieses Konzept. Gewöhnlich muß man dem Programm noch mitteilen, wie groß das Feld maximal werden
kann,
d.h.
wieviele Patienten man maximal untersuchen oder wieviele Ausprägungen man höchstens
betrachten möchte. Man nennt
diesen Vorgang Dimensionieren eines Feldes und die kung besteht im
Reservieren
ist dabei zu wissen, daß
Wir-
von Speicherplatz. Wichtig
der
Speicherplatz
reserviert wird, wenn er aktuell gar nicht
auch voll
dann ausge-
schöpft wird. Anders in MUMPS.
Das
Dimensionieren entfällt komplett,
es wird tatsächlich nur so viel aktuell benutzt wird. Speicherplatz, denen
Nur ein
Platz
diejenigen Wert
verbraucht, Elemente
zugewiesen
spricht in MUMPS deshalb von der
wurde.
'gestreuten'
wie
belegen Man
Speiche-
rung der Felder (engl, sparse array). Übrigens wird in anderen Sprachen
die
Variable
noch deklariert, mit anderen Worten, es wird
selbst
angegeben,
um welchen Datentyp es sich handelt, eine Maßnahme, in MUMPS überflüssig ist, weil MUMPS nur einen
die
Datentyp
kennt. Ein etwas anderes
Interpretationsmuster ergibt sich bei
der Betrachtung einer 'hierarchischen' Datenstruktur. Am besten macht man sich
die
eines Baumes klar, eines
Abspeicherungsform Baumes,
der
sich
am im
spiegelt, wo also der Stamm nach oben und die Äste unten zeigen. Als Beispiel wollen wir die lokale ble A betrachten,
die sowohl
einem und mit zwei Indizes
ohne Index, als
vorkommen
soll.
Bild Wasser nach Varia-
auch mit Der
unter jedem Element gibt an, ob es einen Wert hat.
Stern
Die Datenstruktur
149
A
A(Z)
A(1)
A("IN")
A(1,3) A(1,7) A(1,9) A(Z, 1) A(Z,»W") A("IN»,3) » * « » « «
A(»IN»,9) •
Man beachte noch, daß Z eine Variable ist. A bezeichnet man als die Wurzel des Baumes. Die Äste des Baumes verbinden die als Knoten bezeichneten
Teile
der
indizierten Variablen wie A, A(1) oder A(1,3).
An
A(Z)
sieht man, daß Knoten Werte enthalten
es
aber
nicht müssen. Von
A
können,
sagt man, es stehe auf der 0. (In-
dex«) Stufe, während A(1) und A("IN")
auf
der
und die zweifach indizierten Variablen auf stehen. A(1) und A("IN") bezeichnet
man
I.Stufe
der als
zweiten Vorgänger
der zweifach indizierten Variablen A(1,*) und A("IN",*). Entsprechend sagt
man
Variablen, sie seien
von
den
zweifach
indizierten
Nachfolger der einfach
indizierten
Um eine Fehlermeldung zu vermeiden, die beim
Ansprechen
Variablen.
von nichtdefinierten Variablen
auftreten
wissen, ob eine Variable existiert, bevor arbeitet. MUMPS stellt dazu zwei Funktionen
kann, muß man man zur
mit
ihr
Verfü-
gung, die es erlauben, eine Baumstruktur zu analysieren.
150
Analyse der Struktur
4.3 Die Analyse der Struktur Wie wir weiter oben dargestellt haben, werden nur die Elemente
von Feldern
bzw.
in
nur die
MUMPS
Teile
von
Bäumen abgespeichert, denen explizit ein Wert zugewiesen wurde. Wenn man nun Programme schreiben will, gestreuten Datenstrukturen operieren,
die wird
auf
die Aufgabe gestellt, zu entscheiden, ob ein Knoten eines Baumes
diesen
man oft vor bestimmter
existiert. Hier können verschiedene
Fälle auftreten. Daher
muß
es
möglich sein, festzustellen,
unabhängig
ob
ein
voneinander
Knoten Nachfolger
hat bzw. ob er Daten enthält. Diese Entscheidung kann mit der Funktion $DATA werden. Wir wollen und uns dabei
sie
die lokale
zunächst Variable
getroffen
summarisch vorstellen A aus
dem
letzten
Abschnitt als definiert denken: Beispiel ?W $DATA(A) 11 ?W $DATA(A(Z)) 10
?W $DATA(A("IN",22)) 1
?W $D(A(1,2,3)) 0 1 Das Argument der Funktion $DATA ist stets eine Variable, die indiziert sein kann, aber
nicht muß. $DATA kann mit
Analyse der Struktur $D abgekürzt werden. Der Wertevorrat der die Zahlen 0,
1, 10,
11.
Funktion
Existiert die
angegebene Variable nicht, so ist das
151
als
sind
Argument
Ergebnis
eine
0
(letztes Beispiel). Existiert die Variable und hat Nachfolger auf einer
tieferen Stufe,
wird eine 11
als Er-
gebnis geliefert (1. Beispiel). Hat hingegen ein keinen Wert, aber Nachfolger, dann hat 10. Diese Situation war
bei
der
$DATA
lokalen
Knoten
den
Wert
Variablen
A
gegeben, als kein Wert von A(Z), aber sowohl A(Z,1), als auch A(Z,"W") definiert
waren.
noch den Wert
der angebene Index,
Nachfolger
1, falls
$DATA
hat
schließlich aber keine
existieren.
Wir wollen den Sachverhalt
an
einer
Tabelle
verdeut-
lichen: Übersicht Uber ¿DATA Wert einer lok. Variable existiert
\
hat
¡hat keine
\ Nachfolger ¡ $D ist 11
|
¡Nachfolger \ I $D ist 1
existiert nicht¡ $D ist 10 I $D ist 0
Man kann sich die Funktionsweise von $DATA merken: die Einerstelle gibt an, ob die enthält (Einerstelle gleich
auch
anders
Variable
1), oder nicht
Daten
(Einerstelle
gleich 0). Entsprechendes gilt für die Zehnerstelle. Sie gibt über die Existenz eines Nachfolgers Auskunft, wobei man noch beachten muß, daß die Zahldarstellung in führende Nullen unterdrückt und daher die Zehnerstelle nicht dargestellt wird.
Null
MUMPS in
der
152
Analyse der Struktur
Abschließend wollen wir
noch
zwei
Programmiererleich-
terungen angeben. Angenommen man möchte wissen, Knoten existiert. Der obigen Tabelle entnehmen beiden Möglichkeiten $D
ist 1
oder $D ist
ob
ein
wir
die
11. Anstatt
der logischen Abfrage I $D(VAR)=1!($D(VAR) = 11) schreibt man besser I $D(VAR)#10 , denn die Restdivision von 1 und 11 durch 10 ergibt stets 1. Ebenso verfährt man, wenn
man wissen möchte,
Knoten einen Nachfolger hat.
Das
ist
Fall, wenn $DATA den Wert 10 oder 11
genau hat.
ob ein
dann
der
Anstatt
der
Abfrage I $D(VAR)12
W K" W "ENDE"
ENDE ?
Die Behandlung des
XECUTE-Arguments
als
Unterprogramm
hat interessante Folgen, wenn GOTO-Befehle in
ihm
halten sind. Beispiel ¡TEST ; Hesse, Kirsten ; 28.09.82 ; Test fuer XECUTE \ X "G A" W "Nach XECUTE",! Q ¡A W "Im Unterprogramm",! Q Die Ausführung von TEST ergibt folgendes Resultat: ?D "TEST Im Unterprogramm Nach XECUTE 9
ent-
Dynamische Veränderung von Programmen Obwohl der GOTO-Befehl führt, bleibt die
aus
dem XECUTE-Argument heraus-
Rücksprungadresse
für die Ausführung des
187
dem
XECUTE
erhalten und sorgt folgenden
Befehls,
wenn ein QUIT erkannt wurde. Das GOTO wird also nun Sprung innerhalb des
Unterprogramms
als
angesehen, der die
Rücksprungadresse in keiner Weise beeinflußt. Jetzt wollen wir noch eine andere interessante Anwendung des XECUTE vorstellen. Dazu
ist
zuerst die
kennenzulernen.
Funktion
$TEXT
es
jedoch
dazu, einzelne Zeilen der Routine, die Speicher befindet, im
Programmablauf
chen. Wir wollen die Funktion anhand
notwendig, Sie
sich
dient
gerade
verfügbar von
im
zu ma-
einigen
Bei-
spielen zur Schreibweise erläutern. Beispiele $TEXT(A) $T(A+5) $T(+0) $T(+2) $T(2) Der Name $TEXT kann zu $T abgekürzt werden. Die Funktion liefert jeweils eine Zeile der sich im Speicher
befind-
lichen Routine. Die Auswahl der Zeile wird durch das Argument
bestimmt.
Hat das Argument die Form eines Zeilenlabels
(mit
ohne Offset), so wird die bezeichnete
übergeben.
Ist das Label nicht vorhanden
Zeile
oder das Offset
oder
zu groß,
liefert die Funktion den Leerstring. Eine andere Form des Arguments besteht aus zeichen gefolgt von
einem
dieser Schreibweise gibt
ganzzahligen der
Wert
welche Zeile geliefert werden soll.
des
einem
Plus-
Ausdruck.
Bei
Ausdrucks
an,
188
Dynamische Veränderung von Programmen
Ist der Wert
gleich 0,
grammnamen. Ist er
liefert
gleich
1,
die Funktion liefert
sie
die
Zeile, bei 2 die zweite Zeile und so weiter.
Speicher
ist oder
erste
Auch
liefert die Funktion den Leerstring, wenn der Ausdrucks zu groß
den Prohier
Wert
wenn sich keine
des
Routine im
befindet.
Die letzten beiden
Beispiele
den Unterschied der
verdeutlichen noch einmal
beiden Schreibweisen. Der vorletzte
Funktionsaufruf würde die
zweite
Zeile
des
die
Zeile
liefern, während der letzte Aufruf
Programms mit
dem
wenn
man
Label 2 liefert. Die $TEXT-Funktion läßt sich elegant größere Mengen von
nutzen,
unveränderlichen Daten, zum Beispiel
Tabellen oder Bildschirmmasken, Dann schreibt man die Daten
im
Programm
in Form von
das Programm und greift darauf
mit
der
benötigt.
Kommentaren in $TEXT-Funktion
zu. Eine andere Anwendung erwähnt, im
bietet
Zusammenhang
mit
sich, dem
wie
bereits
oben
XECUTE-Befehl
an.
Dieser Befehl erlaubt die Ausführung von Programmen, die nicht wie üblich im Programmspeicher stehen, sondern die in Variablen enthalten sind. Da der Programmspeicher nicht
benötigt
wird,
wird
er
auch nicht verändert. Daher kann man seinen Inhalt, also z.B. ein mit
dem
BREAK-Befehl unterbrochenes Programm,
mit einer einfachen Routine ausgeben. Man speichert dazu die Befehlsfolge F $1=0:1 Q:$T(+$I)=""
W $T(+$I),!
in einer lokalen oder globalen Variablen ab. Angenommen, man verwendet dazu die Variable
~$LIST,
kann man die Ausgabe der Programmliste mit dem Befehl
so
Dynamische Veränderung von Programmen
189
X "$LIST starten. Manche MUMPS-Installationen benutzen ähnliche
Mechanis-
men in Verbindung mit implementierungsabhängigen terungen des Befehlssatzes
zum
Abspeichern
Erwei-
und Korri-
gieren von Programmen.
In vielen Fällen will man die Möglichkeiten
der
daten-
abhängigen Programmodifikation nur benutzen, um bestimmte Teile eines Befehls zu modifizieren. MUMPS stellt für diesen Fall eine
gegenüber dem XECUTE-Befehl
einfachere
Möglichkeit zur Verfügung, die Indirektion. Sie erlaubt eines Namens
die oder
Modifikation eines
heißen die verschiedenen
eines
Befehlsarguments,
Musterelements.
Entsprechend
Varianten der Indirektion auch
Argument-Indirektion, Namens-Indirektion und
Muster-In-
direktion. Zuerst wollen wir uns mit der naheliegendsten Indirektion, der Namens-Indirektion
überall dort zulässig, wo ein Variablen- oder name stehen kann. Sie wird angezeigt eines 'Klammeraffen' (§) Enthält dieser Ausdruck
Form
der
Sie
ist
befassen. durch
Programmdie
Angabe
vor einem beliebigen Ausdruck. zweistellige Operatoren, muß er
in Klammern eingeschlossen sein. Die Indirektion bewirkt, daß zuerst
der
Ausdruck
gewertet wird. Die sich ergebende Zeichenkette wird als Name angesehen und es wird dieser Name bei der
ausnun Ver-
arbeitung des Befehls benutzt. Diese Ausführungen sollen wieder an einigen Beispielen erläutert werden.
190
Dynamische Veränderung von Programmen
Beispiele ?S A="B",B=25 W §A 25 ?S R0UT="WRT" D "gROUT (Ausführung der Routine ~WRT) ?S V="ABC",ABC=1 K §V W $D(ABC) 0 ?S A1=5,A2=2,A3=7 F 1=1:1:3 W §("A"_I) 527 ?S A="@B",B="C",C=222 W §A 222 ?S A="B",B="C",C=222 W §@A 222
Die beiden letzten Beispiele verdeutlichen, daß beliebig geschachtelte Indirektion erlaubt ist. Die Namensindirektion erstreckt sich nicht nur auf
ein-
fache Namen von Variablen oder Programmen, sondern
kann
auch bei komplizierteren Namenskonstruktionen
Pro-
grammaufruf mit Angabe
eines
Labels
oder
wie
indizierten
Variablen verwendet werden. Beispiele ?S A="WRT"LIST" D §A ?S VAR="X(1,2,3)",@VAR=5 W X(1,2,3) 5
Bei der Entwicklung von Programmen, die
auf
Teilbäumen von Globals arbeiten können,
steht
beliebigen man
oft
Dynamische Veränderung von Programmen vor dem Problem,
daß in
einer
Variablen der
Teilbaumes steht, also z.B. N="X(2,5)", man untergeordneten Knoten ansprechen
will.
stellung würde in diesem Fall also
191
Name des
aber
Die
lauten:
einen
AufgabenSprich
den
Knoten X(2,5,D) an. Bei Verwendung der Indirektion würde die Lösung so sehen, daß man halt von N
mit
aus-
Textverarbeitungsfunktionen den In-
so modifiziert,
daß der Name
des anzuspre-
chenden Knotens erzeugt wird. Diese Vorgehensweise ist
recht
aufwendig
sichtlich. Daher ist seit dem neuen eine Variante der
Standard
Namensindirektion
'Namespace Notation' nennt. die oben gestellte Aufgabe
und
unübervon
erlaubt,
Mit
dieser
durch
den
1982
die sich
Notation würde Ausdruck
£N@(D)
gelöst. Dazu einige Beispiele: Beispiele ?S B="XYZ",@B@(1)=1 W XYZ(1) 1 ?S C="ABC(2,3)",@C@(4,5) = 23^5 W ABC(2,3,4,5) 23^5 ?S D="A",eC§(D) = ''X" w ABC(2,3,"A") X
7 Die zweite Form der Indirektion, gehen wollen, ist
die
auf die wir
hier ein-
Argument-Indirektion.
Hier wird
ein gesamtes Befehlsargument
oder
sogar eine Argument-
liste durch eine Indirektion dargestellt, ist
also
Er-
gebnis eines Ausdrucks. Die Schreibweise entspricht der der
Namens-Indirektion.
Jedoch werden hier nicht einzelne Namen,
sondern
ganze
192
Dynamische Veränderung von Programmen
Argumente ersetzt. In Argumentlisten von Befehlen können direkte und indirekte
Schreibweise
henfolge erscheinen. Auch das
in
soll
beliebiger Rei-
wieder
durch
Bei-
erklärt
sich
spiele erläutert werden. Beispiele ?S A="B=5" S §A W B 5 ?S A= ,, B=5",eA W B 5 ?S B=5,A="B=5" W §A 1 ?S U="A,B" D eu (Ausführung der Unterprogramme A und B) ?S B=1,X= "B= 111 I @X W "JA" JA ?S B=1,X="B=1" WseX "JA" (Fehlermeldung) 7 Die Fehlermeldung beim
letzten
Beispiel
daraus, daß die Postcondition kein also auch keine
Argument
Argument-Indirektion
ist,
erlaubt
hier
ist. Na-
mens-Indlrektion wäre hier erlaubt, jedoch ist dafür der Inhalt der Variablen X nicht zulässig. Jetzt wollen wir uns benutzten Form der
noch
mit
Indirektion
der
dritten,
befassen.
Muster-Indirektion. Sie erlaubt die
Es
dynamische
seltener ist
die
Defini-
tion von Musterelementen für einen Mustervergleich. Hier wird das gesamte Muster,
also der Teil, der rechts
des Operators für den Mustervergleich steht, durch Indirektion in der
gewohnten
eine
Schreibweise ersetzt. Das
Dynamische Veränderung von Programmen Muster besteht, wie schon früher oder mehreren aneinandergereihten denen jedes
aus
erläutert,
aus
Musterelementen,
Wiederholungsfaktor
und
193 einem von
Musterangabe
besteht. Dieses Muster muß nun durch
den
Inhalt
des
Ausdrucks
dargestellt werden. Auch diese Form der Indirektion soll durch einige Beispiele erläutert werden. Beispiele ?S A="3N" W 123?§A 1 ?S M="2N3A2N" W "30SEP82"?eM 1 ?S WFrSjMAs"""Z""" W
H
ZZZZZ"?e(WF_MA)
1 ?S W=" 1.3" W "XX- 123"?§(W_ ,, A1P"_W_"N") 1 ? Die Beispiele verdeutlichen noch einmal, wie
die
Indi-
rektion den dynamischen Aufbau von Programmelementen zur Laufzeit des Programms erlaubt.
194
Modularer Entwurf
52 Modularer Entwurf von Programmsystemen Die Programme, die wir bis jetzt betrachtet haben, sind von
als
geringem
Beispielprogramme Umfang
und
daher
auch leicht zu überblicken. Anders sieht es aus, wenn entwickeln will. Hier
man
größere
Programmsysteme
müssen gewisse Richtlinien sowohl
be im Entwurf als auch bei der Programmierung eingehalten werden, wenn man vermeiden will, daß das
Programmsystem
unübersichtlich und schlecht wartbar wird. Dies so wichtiger, da ein Programm
in
MUMPS
ist
meistens
um sehr
kompakt geschrieben und daher schwer lesbar ist. Es sind schon von großen
viele
Abhandlungen
Programmsystemen
zur Entwurfsmethodik
geschrieben
wollen uns daher auf einige allgemeine
worden.
Wir
Bemerkungen
auf die Besonderheiten bei der Programmierung
in
und MUMPS
beschränken. Schon beim Entwurf von großen Programmsystemen darauf achten, daß nicht ein unüberschaubares entsteht. Man muß
für
eine
muß
man
'Monstrum'
sorgfältige Strukturierung
des Programms sorgen. Hier bietet sich die Vorgehensweise des
modularen
Ent-
wurfs an. Dabei teilt man das Gesamtsystem in
einzelne,
klar abgegrenzte Funktionsblöcke,
'Module',
sogenannte
ein. Jedes Modul hat klar definierte
Schnittstellen
zu
den anderen Modulen. Diese Schnittstellen werden jedes Modul
einzeln
genau spezifiziert, ehe man
weiter
eines Moduls kann es sinnvoll Untermodule aufzuteilen, deren
betrachtet. sein,
Beim
dieses
weiterer
Entwurf
wieder
in
Entwurf in der
gleichen Weise erfolgt. Durch fortschreitende Verfeinerung
von
Teilkomponenten
des Gesamtsystems gelangt man schließlich zu dem
Punkt,
Modularer Entwurf an dem ein (Unter-) Modul Funktionsumfang
leicht
überschaubaren
besitzt.
Erst jetzt beginnt man mieren. Da nun
einen
195
mit
dem
die Aufgabe
eigentlichen
Program-
nicht mehr lautet,
samte System zu programmieren, sondern
nur
das ge-
noch
einen
kleinen Teilaspekt, ist diese Aufgabenstellung leicht zu lösen. Die oben
angegebene
Vorgehensweise
leicht einsichtig ist -
Methode
feinerung oder Top-Down-Entwurf Auch bei der
Programmierung
wird
auch
- wie
der schrittweisen Vergenannt.
selbst müssen Konventionen
für Programme und Daten eingeführt und auch
eingehalten
werden. Einige Konventionen werden
allgemein bei der Erstellung
von MUMPS-Programmen empfohlen.
Als wichtigste ist hier
die 'first line Convention' zu nennen, die eine schnelle Übersicht über die vorhandenen Programme Diese Konvention sieht vor, daß die Programms nur aus einem Label und
ermöglicht.
erste einem
Zeile Kommentar
steht. Der Kommentar soll Angaben über das datum, den Verfasser
und
die
Funktion
enthalten. Das Label soll identisch
mit
jedes be-
Erstellungsdes
Programms
dem
Programm-
namen sein. Die einzelnen Angaben im Kommentarteil könnten wie folgt angeordnet sein: NAME ; Verfasser ; Datum 5 Angaben zur Funktion Viele MUMPS-Systeme unterstützen die Benutzung der first line Convention durch
Systemprogramme,
aller vorhandenen Programme
erstellen,
die
eine Liste
die jeweils die
erste Zeile jedes Programms enthält. Der Nutzen einer solchen Liste wenn man bedenkt,
ist
daß ein größeres
leicht
einzusehen,
MUMPS-Programmsystem
196
Modularer Entwurf
aus mehreren hundert vielen Namen, die
Routinen
alle
im
bestehen
gleichen
kann.
Bei
so
Inhaltsverzeichnis
aufgeführt werden, verliert man sehr schnell
die
Über-
sicht. Aus dem gleichen Grund ist gebung von Routinen
ein
Hier wird oft für jedes
es sinnvoll, bei der Namensbestimmtes Schema einzuhalten.
Teilsystem ein ein-
oder zwei-
stelliges Namens- oder Projektkürzel vergeben, das jedem Programmnamen vorangestellt wird. man schon dem
Programmnamen
im
Auf
diese Weise kann
Inhaltsverzeichnis an-
sehen, wohin dieses Programm gehört. Eine weitere wichtige Konvention ist die
Benutzung
Kommentaren. Kommentare sollten grundsätzlich
in
von allen
Programmiersprachen möglichst häufig benutzt werden.
In
MUMPS stellt sich die Situation jedoch etwas komplizierter dar, da hier
die
Kommentare
speicherplatz belegen. Aus Forderung nach möglichst
wertvollen
dieser spärlicher
Programm-
Gegebenheit
ist die
Benutzung von Kom-
mentaren abzuleiten. Die beste Lösung wird hier in einem Kompromiß der beiden gegensätzlichen Forderungen liegen. nie vollkommen auf Kommentare
Jedoch
sollte
Bei großen Programmsystemen kann sich auch eine tion über die Verwendung
von
man
verzichten.
Variablennamen
Konvenals
sehr
sinnvoll erweisen. Eine Möglichkeit besteht zum Beispiel darin, alle systemweit benutzten Variablen mit dem
Pro-
zentzeichen (%) beginnen zu lassen. In manchen Systemen wird auch
die
Konvention
benutzt,
daß jedes Unterprogramm Variablen mit einstelligem Namen beliebig verwenden darf.
Gleichzeitig darf jedoch nicht
vorausgesetzt werden, daß einstellige Variablen über den Aufruf eines Unterprogramms hinaus ihren Wert behalten.
Modularer Entwurf Man könnte auch für jedes Unterprogramm oder
197
Teilsystem
einen ein- oder zweistelligen Zeichencode vergeben. Alle Namen von Variablen, die in dem
entsprechenden
teil benutzt werden, müssen dann mit diesem
System-
Zeichencode
beginnen. Bei der Festlegung der Konventionen über die von Variablen ist
dem
Verwendung
Entwickler eines Softwaresystems
freie Hand gelassen, jedoch sollte darauf geachtet den, daß
einmal
eingeführte
Konventionen
wer-
durchgehend
eingehalten werden.
Nun wollen wir noch einige Bemerkungen über das strukturierte Programmieren in MUMPS folgen lassen. MUMPS bietet als Sprache leider nicht die
Unterstützung
bei der strukturierten Programmierung, wie man sie
z.B.
von Programmiersprachen der PASCAL-Familie gewohnt ist. Es gibt kein BEGIN und END
zur
Klammerung
zusammengehöriger Programmteile.
Dagegen
strukturell bietet
MUMPS
als natürliche Einheit der Strukturierung die Zeile. die Länge einer Zeile begrenzt ist,
muß
teilweise
Da mit
DO-Befehlen und Unterprogrammen gearbeitet werden. Bei geschickter und
disziplinierter
Verwendung
MUMPS gegebenen Strukturen ist auch hier
der in
eine
struktu-
dadurch,
daß alle
rierte Programmierung möglich. Eine weitere Schwierigkeit Variablen in allen
entsteht
Programmteilen 'gesehen 1
nen. Damit hat natürlich lichkeit, die Variablen
jedes von
werden kön-
Teilprogramm
die
Mög-
anderen Teilprogrammen be-
absichtigt oder unbeabsichtigt zu ändern. Dieses Problem kann durch die
Einhaltung
von
Verwendung von Variablennamen
Konventionen beseitigt
mindest verringert werden (siehe oben).
oder
über
die
doch zu-
198
Modularer Entwurf
Parameter von
Unterprogrammen
übergeben, daß bestimmte, vorher
werden
einfach
vereinbarte
dadurch Variablen
in den gemeinsamen Speicher gestellt werden. Daher sen Hauptprogramm und für die Parameter
Unterprogramm
müs-
die gleichen Namen
verwenden.
Das erschwert die Erstellung und Verwendung
von
allge-
meingültigen Unterprogrammen. Hier muß das Hauptprogramm sich entweder an
die
Namensgebung
anpassen oder bei jedem Aufruf Parameter
des
Unterprogramms
des
Unterprogramms
die
die
Lesbarkeit des Pro-
kopieren.
Beide Möglichkeiten verringern
gramms. Leider bietet sich beim gegenwärtigen Stand
der
Sprachentwicklung keine
des
Problems.
Möglichkeit
zur
Lösung
MUMPS-Prozesse
199
5.3 MUMPS-Prozesse und deren Steuerung Die Sprache MUMPS wurde für den Einsatz Mehrbenutzersystemen
entwickelt.
schon aussagt, ermöglichen
in
sogenannten
die
Bezeichnung
Systeme
die gleich-
Wie
solche
zeitige Ausführung von Programmen mehrerer Benutzer. Im allgemeinen bestehen die Rechner aus nur arbeitungseinheit (CPU). Wie läßt
sich
einer
Ver-
die
For-
aber
derung nach gleichzeitiger Ausführung mehrerer me, also nach
gleichzeitiger
weisungsströme, mit dem arbeitungseinheit
Program-
Verarbeitung mehrerer An-
Vorhandensein
nur
einer
Ver-
vereinbaren?
Die Lösung für dieses Problem bietet 1
lelverarbeitung , bei der die
1
die
Quasi-Paral-
Verarbeitungseinheit
kurze Zeit ein Programm bearbeitet
und
dann
die
für Aus-
führung unterbricht, um ein anderes Programm zu bearbeiten. Auch hier wird
die
Ausführung
nach
kurzer
Zeit
unterbrochen, um ein drittes Programm auszuführen. Nachdem das letzte Programm für kurze Zeit bearbeitet wurde, erhält wieder das erste Programm etwas Rechenzeit, usw. Da hier gleichsam die
gesamte
zur
Verfügung
stehende
Rechenzeit in Scheiben geschnitten wird, nennt beschriebene Verfahren
auch
die Rechenzeit gleichmäßig
Zeitscheibenverfahren. unter
geteilt wird, hat der einzelne alleine an einem
Rechner
man
das Da
allen Programmen auf-
Benutzer
mit geringerer
den
Eindruck,
Rechenleistung
zu arbeiten. Die einzelnen Programme, die von der Maschine parallel verarbeitet werden, halb jedes einzelnen
scheinbar
nennt man Prozesse.
Inner-
Prozesses erfolgt die Verarbeitung
streng sequentiell, das heißt, in einem Programm
werden
die Befehle immer in einer fest vorgegebenen Reihenfolge
200
MUMPS-Prozesse
nacheinander ausgeführt.
Die
Reihenfolge
jedoch durch DO, GOTO, XECUTE und QUIT
selbst
kann
beeinflußt
wer-
den. Ein Prozeß wird normalerweise gestartet, nutzer anfängt, an der Maschine allgemeinen durch die
wenn
Ausführung
des
Be-
HALT-Befehls be-
endet. Es gibt jedoch auch Anwendungsfälle, Prozeß nicht von einem
ein
zu arbeiten. Er wird im
Terminal
aus
in denen ein
gestartet
werden
soll, sondern wo ein Prozeß unabhängig von einem menschlichen Benutzer im Hintergrund arbeiten soll. Diese Prozesse werden
meistens
gestartet. Dazu wird das den Start MUMPS wird
ein
anderen
Prozessen
spezielles Kommando
eines neuen
hierzu
von
benötigt,
Prozesses zur Folge
das
JOB-Kommando
Schreibweise soll zunächst
an
hat. In
benutzt.
einigen
Seine
Beispielen
er-
läutert werden. Beispiele JOB JOB B,X~START J
PARM,START~PRINT:(PARI:PAR2)
J "NAME::10 ELSE J:COND
G ERR
"ROUT:55:20
J @IND Der Befehl JOB kann zu wird der Einsprungpunkt
J abgekürzt werden. Als Argument einer
Angabe bewirkt, daß in dem
Routine angegeben. Diese
neuen
Prozeß
implizit
ein
DO-Befehl auf den Einsprungpunkt gegeben wird. Wird der Einsprungpunkt in der lokalen so beginnt die Ausführung des
neuen
Form
angegeben,
Prozesses
an
dem
angegebenen Label in der gerade benutzten Routine. Auch beim JOB-Kommando Für jedes Argument
wird
ist ein
eine Argumentliste eigener
Prozeß
dessen Ausführung an der angegebenen Stelle
erlaubt. erzeugt,
beginnt.
MUMPS-Prozesse Es ist möglich,
das
JOB-Kommando mit
spezifischen Parametern
zu
versehen.
werden durch einen Doppelpunkt (:) von Einsprungpunktes
getrennt.
Sollen
201
implementierungsDiese der
Parameter Angabe
mehrere
des
Parameter
angegeben werden, so müssen sie in Klammern eingeschlossen und untereinander
durch
Doppelpunkte getrennt wer-
den. Auch die Angabe eines Timeouts ist
erlaubt.
aus irgend einem Grund nicht sofort
möglich
neuen Prozeß zu erzeugen, wird dies höchstens versucht, wie durch den Timeout
angegeben
Sollte
es
sein,
den
so
lange
wurde.
Wenn
die Prozeßerzeugung innerhalb der angegebenen Zeit nicht möglich war, wird $TEST auf 0 gesetzt und mit führung des Programms
der
Aus-
fortgefahren.
Wenn ein Timeout angegeben ist und innerhalb dieser Zeit der neue Prozeß erzeugt werden
konnte, wird $TEST auf 1
gesetzt und das Programm weiter ausgeführt. Wurde kein Timeout angegeben, lange, bis es möglich ist,
wartet
das
Programm
so
den neuen Prozeß zu starten.
$TEST wird in diesem Fall nicht verändert. Das Timeout wird von den pelpunkt getrennt. Wenn müssen die beiden
Parametern
durch
einen
Dop-
keine Parameter vorhanden sind,
Doppelpunkte
direkt nacheinander ge-
schrieben werden. Natürlich sind
auch
hier
Postcondition
sowie Namens- und Argumentindirektion
In manchen Anwendungen ist es
des
Befehls,
erlaubt.
erforderlich,
eine
ein-
deutige Identifikation des gerade laufenden Prozesses zu erhalten. Dazu dient die spezielle
Variable
$J0B.
hat einen Wert, der den laufenden Prozeß eindeutig tifiziert.
Sie iden-
202
MUMPS-Prozesse
Beispiele S W
"SCRATCH($JOB,X)=A DATUM," ",$J
Der Name $J0B
kann zu
$J abgekürzt werden.
Der Inhalt
von $J0B kann zum Beispiel dazu dienen, einen systemweit eindeutigen Teilbaum eines Globals zu erzeugen, um große Datenmengen temporär
abzuspeichern.
Eine andere
Anwendungsmöglichkeit
zierung der
Herkunft
einer
wäre
die
Druckerausgabe
Identifidurch
den
Inhalt von $J0B.
Am Ende der Betrachtungen über Prozesse sei noch auf die starke Maschinenabhängigkeit der gesamten Materie hingewiesen. So gibt es zum Beispiel auch MUMPS-Systeme, nur für Einprozeß-Betrieb
ausgelegt
sind.
die
Hier können
natürlich auch keine neuen Prozesse erzeugt werden. Eine weitere Schwierigkeit besteht darin, daß
die
mei-
sten heutigen MUMPS-Systeme neue Prozesse nicht mit JOB-Befehl erzeugen, sondern
dazu
dardisierte Befehle benutzen. im folgenden
Kapitel
noch
Daher
andere,
dem
nicht stan-
empfehlen wir, wie
ausführlicher
dargestellt,
nach Möglichkeit den JOB-Befehl nicht zu verwenden. Wenn es sich nicht vermeiden läßt, diesen Befehl zu benutzen, sollte er mit anderen
implementierungsspezifischen
fehlen in besonderen, in der Dokumentation genau
Be-
ausge-
wiesenen, Programmteilen zusammengefaßt werden. Im Gegensatz dazu ist die spezielle Variable $J0B in den meisten MUMPS-Systemen anzutreffen, kann aber vollkommen unterschiedliche Werte annehmen. Im folgenden
Abschnitt
sollen
die
Betrachtungen
zum
Thema Portabilität, also Übertragbarkeit von Programmen, noch weiter vertieft werden.
Portabilität
203
5.4 Portabilität von MUMPS-Programmen Ein sehr wichtiger Vorteil von MUMPS besteht darin, die Sprache
standardisiert
ist.
sorgt dafür, daß Programme, die dieser Sprache geschrieben einem anderen Rechner
Die auf
einem
wurden,
laufen
daß
Standardisierung Rechner
in
ohne Änderungen auf
können,
der
auch
MUMPS
unterstützt. Diese 'Portabilität' genannte Eigenschaft men, auf einfache
Art von
von
Program-
einem Rechner auf
einen an-
deren übertragen werden zu können, ist nicht so verständlich, wie sie auf den
ersten
Blick
selbst-
erscheinen
mag. Betrachtet man zum
Beispiel
eine nicht
standardisierte
Sprache, so werden Programme, die in dieser Sprache Rechnern verschiedener
Hersteller
zwar ähnlich aussehen, sich aber voneinander
auf
geschrieben
wurden,
wichtigen
Details
in
unterscheiden.
Die Unterschiede gehen manchmal so weit, daß
die
Über-
tragung eines Programms
auf
einen
anderen mehr Aufwand
von
einem
fordert,
Rechner
als seine Neuprogrammie-
rung. Ein gutes Beispiel für mangelnde Portabilität
sind
die
der
zu-
verschiedenen BASIC-Dialekte, die sich im Zuge nehmenden
Verbreitung
von
Mikrocomputern
entwickelt
haben. Die verschiedenen Dialekte haben
nur
befehle für
usw.
Zuweisung,
Drucken
noch
die
gemeinsam.
weitergehenden Sprachkonzepte sind von jedem in eine andere Richtung entwickelt
Grund-
worden.
Alle
Hersteller Die
schiede sind so groß, daß eine Übertragung von
UnterProgram-
men nahezu unmöglich gemacht wird. Zwar wurde auch BASIC vor wenigen Jahren jedoch deckte dieser Standard nur
die
standardisiert, sowieso
selbst-
201
Portabilität
verständlichen Grundfunktionen ab. Alle zur universellen Ersetzbarkeit
notwendigen
Erweiterungen
Herstellern überlassen, die hier
blieben
verschiedene
den
Lösungen
für die gleichen Fragen fanden. Erst in jüngster Zeit
wird
versucht,
auch
für
BASIC
Hier
wurde
einen umfassenden Standard zu definieren. Anders sieht die Situation bei schon relativ frühzeitig
ein
alle wichtigen Funktionen zieht
sogar
die
MUMPS
aus.
Standard
umfaßt.
eingeführt, der
Dieser
Standard be-
herstellerspezifischen
Erweiterungen
ein, indem er bestimmte Befehls-, Funktions- und
Varia-
blennamen dafür vorsieht. Die wichtigste
Gruppe
fehlsnamen bilden die
von
herstellerspezifischen
Z-Befehle.
Von
ihnen
wird
Benur
verlangt, daß ihr Name mit Z beginnt. Wie er fortgesetzt wird, wie die Abkürzung lautet, welche Argumente sig sind und welche Wirkung
sie haben, bleibt
zuläsdem Her-
steller überlassen. In der Gruppe der Z-Befehle können
beliebig
viele
Be-
fehle zur Erweiterung der Sprache vorgesehen werden. Ähnlich vage ist
die
Spezifikation
des
VIEW-Befehls.
Dieser Befehl kann zur Anzeige und Manipulation neninterner Information benutzt
werden.
maschi-
Auch hier sind
wieder die zulässigen Argumente und deren Bedeutung
dem
Hersteller überlassen. Alle noch nicht namen sind für
belegten Anfangsbuchstaben von Befehlsspätere,
standardisierte
Erweiterungen
der Sprache vorgesehen und sollen nicht von den Herstellern für eigene Erweiterungen benutzt werden. Entsprechend den Befehlen
können
auch
Funktionen
spezielle Variablen um Namen erweitert werden, $Z beginnen. Auch hier sind Abkürzungen und vom Hersteller
festzulegen.
die
und mit
Bedeutungen
Portabilität In der Gruppe der Funktionen ist, wie auch bei
205
den
Be-
fehlen, noch eine besondere Möglichkeit zum Zugriff
auf
maschineninterne Informationen
vorgesehen.
Dazu
dient
die Funktion $VIEW. Wieder sagt der Standard nichts über Anzahl und Bedeutung der Argumente aus. Alle noch nicht belegten, von buchstaben für Funktionen
Z
und
abweichenden
Anfangs-
spezielle Variablen sind
reserviert für spätere standardisierte Erweiterungen und sollen nicht herstellerspezifisch belegt werden.
Wenn man portable, also übertragbare Programme will, sollte man
die
Benutzung
der
schen Namen vermeiden. Das gleiche gilt für spezifische Teile
von
schreiben
herstellerspezifihersteller-
Befehlsargumenten.
(siehe
z.B.
OPEN, USE, JOB, usw.). Der BREAK-Befehl stellt hier einen Extremfall
dar.
Der
Standard definiert seine Wirkung, wenn er ohne Argumente gegeben wird. Zusätzlich sieht der Standard
jedoch
im-
plementierungsabhängige Argumente des Befehls
vor.
Die
Verwendung eines solchen Arguments
natürlich
erschwert
die Übertragbarkeit eines Programms.
Es gibt jedoch noch einen anderen Aspekt der tät von Programmen. Er bezieht sich
auf
Portabili-
das
Verhalten
des MUMPS-Systems in Fällen, die im Standard nicht angegeben sind. Ein Beispiel hierfür ist das Verhalten
des
Bildschirms
nach Ausführung eines READ-Befehls. Bei manchen Systemen bleibt nach dem Drücken der Return-Taste der seiner ursprünglichen
Position
stehen.
Systemen wird er an den Zeilenanfang positioniert.
Bei an
den
an
anderen
positioniert.
wieder anderen Systemen wird der Cursor der folgenden Zeile
Cursor
Bei
Anfang
206
Portabilität
Daher sind Programme, die ein bestimmtes Rechners in diesen
Verhalten
des
Fällen voraussetzen, nicht portabel.
Bei dem oben erwähnten Beispiel des READ-Befehls ein solches Programm voraussetzen,
daß
der
könnte
Cursor
seiner Position stehen bleibt und automatisch
an
eine
un-
Es lassen sich noch viele weitere Beispiele finden,
bei
vollständige Eingabe ergänzen. denen nicht allgemein
gültige
Annahmen
die
Übertrag-
barkeit von Programmen erschweren. Daher sollte man sich beim Schreiben eines portablen Programms auf den Sprachstandard und auf die Portabilitätsanforderungen
stützen
und nur die dort gemachten Aussagen voraussetzen.
In manchen Fällen läßt es sich nicht mentierungsspezifische Befehle zu pfiehlt es sich, diese Befehle wenigen Unterprogrammen
vermeiden,
verwenden.
in
einem
imple-
Hier
oder
em-
einigen
zusammenzufassen.
Diese Unterprogramme sollten
in
sonders hervorgehoben werden.
der
Bei
Dokumentation be-
der
Übertragung auf
einen anderen Rechner müssen dann nur die wenigen, genau definierten Unterprogramme geändert samte Programmsystem auf
dem
werden,
neuen
um das ge-
Rechner
funktions-
fähig zu machen. Zum Abschluß dieses Kapitels wollen wir auf
die
Bezie-
hung zwischen Programmoptimierung und Portabilität
ein-
gehen. eines
Pro-
gramms auf eine spezifische MUMPS-Implementierung.
Im allgemeinen bezieht sich die Optimierung
Daher
bindet man sich durch die Optimierung an einen
bestimm-
ten Rechner. Es ist nun durchaus
möglich,
kürzere Laufzeiten auf der Übertragung auf Auswirkungen haben.
einem
einen
daß
die
Rechner
anderen
Maßnahmen,
die
ermöglichen, bei
Rechner
ungünstige
Portabilität Daher sollte man bei jeder Optimierung
eines
207
portablen
Programms sehr genau überlegen, ob die zugrundeliegenden Voraussetzungen allgemeingültig
für
alle
MUMPS-Inter-
preter gelten. Wir haben die Erfahrung gemacht,
daß hier sehr
oft die
Eigenschaften der eigenen Maschine in unzulässiger Weise verallgemeinert werden. Wenn man zu dem eben Gesagten noch
berücksichtigt,
daß
Optimierungen meistens auf
der
von
Kosten
Programmen durchgeführt werden, wert, auf die Optimierung verzichten.
von
ist
Lesbarkeit
es oft empfehlens-
Programmen
komplett
zu
MUMPS auf Mikrocomputern
209
MUMPS auf Mikrocomputern
Die technologische
Entwicklung,
immer mehr elektronische
die
es
ermöglichte,
Funktionen auf immer kleinerem
Raum zusammenzufassen, hat dazu geführt, daß die Rechenleistung der ersten
elektronischen
ganze Räume füllten,
heute
Rechner,
bereits
die
noch
von Mikrocomputern
erreicht wird. In ihren prinzipiellen
Möglichkeiten
sind
die
Mikro-
computer sogar mit ihren größeren Brüdern wie Mini-
und
Großrechnern vergleichbar. Sie
nur
durch die Geschwindigkeit
und durch die unterschiedlichen Der Anwendungsbereich von lich charakterisieren
unterscheiden
sich
der Ausführung von Programmen Speicherkapazitäten.
Mikrocomputern läßt sich ähn-
wie
eines
der
Hauptanwendungs-
gebiete von MUMPS: Kleine, flexible Systeme
zur
Daten-
haltung und -manipulation. MUMPS fordert nur einen hältnismäßig kleinen
Hauptspeicher,
den
die
ver-
meisten
Mikrocomputer bieten können. Daher lag es nahe, auch auf
Mikrocomputern
für die
implementieren.
Sprache
MUMPS
zu
Interpreter gilt der gleiche Standard, wie Implementi erungen auf Mini—
Interpreter Für er
für
diese die
und Großrechnern gilt. Also
darf sich das Verhalten von Programmen,
die
auf
einem
der Rechnertypen entwickelt sind, nicht ändern, wenn sie auf Rechnern der anderen Klassen benutzt werden. Auf der Ebene der höheren Programmiersprache
MUMPS
be-
steht kein Unterschied mehr zwischen den Rechnern unterschiedlicher Klassen oder unterschiedlicher Es kann jedoch sein, daß
Hersteller.
bestimmte Befehle bei der Ver-
wendung von Mikrocomputern nicht mehr sinnvoll sind. Zum
210
MUMPS auf Mikrocomputern
Beispiel sind viele
Mikrocomputer
für den Einbenutzer-
betrieb ausgelegt. In dieser Umgebung ist natürlich
die
Verwendung des LOCK-Befehls nicht sinnvoll, da es keinen anderen Prozeß geben
kann,
rechte auf eine Variable Auch einige andere
der
gleichzeitig
Zugriffs-
beansprucht.
MUMPS-Sprachelemente,
wie
spiel die spezielle Variable $J0B, zielen auf wendung in einem Mehrbenutzersystem ab und
zum Beidie
Ver-
ergeben
bei
Einbenutzersystemen keinen Sinn. Es gibt heute
viele
auf denen eine
verschiedene
noch
größere
Mikroprozessortypen,
Anzahl Mikrocomputertypen
aufbaut, bei denen die Mikroprozessoren in eine Umgebung eingebettet sind, die
ihre
sinnvolle
Anwendung ermög-
licht . Es ist nahezu unmöglich, für lichen Mikrocomputer
alle auf dem Markt befind-
MUMPS-Implementierungen
fügung zu stellen. Jedoch bietet an, durch die
Verwendung
systemen auf vielen
von
sich
zur
sodaß
Ver-
Möglichkeit
einheitlichen
verschiedenen
Schnittstelle zu schaffen,
die
Betriebs-
Rechnern die gleiche die Interpreter
mehr auf einzelne Rechner angepaßt werden
nicht
müssen,
son-
dern nur auf die verschiedenen Betriebssysteme. Im Laufe der Zeit wurde das häufiger benutzt.
Dieses
Betriebssystem System
meisten verbreiteten Rechner
wird
genden Z80- oder
8080/8085-Cpu
Erweiterungen angeboten, die
heute
angeboten.
Mikrocomputer, die nicht auf der dem
CP/M
CP/M
immer
für
die
Selbst für die zugrundelie-
basieren, werden häufig
einen der genannten Mikro-
prozessoren enthalten und den Einsatz
von
CP/M
ermög-
lichen. Wegen der weiten Verbreitung von CP/M beispielhaft auf
eine
wollen
wir
hier
MUMPS-Implementierung
für
CP/M
MUMPS auf Mikrocomputern eingehen. Es ist dies der von der Mumps Users 1 einem sehr günstigen an der University
211
Group
zu
Preis erhältliche Interpreter, der
of California
in Davis von
Prof. R.
Walters und Steve Johnson entwickelt wurde. Er trägt den Namen 'MicroMUMPS'. Im Rahmen seines einjährigen Aufenthaltes in Deutschland
an
der Universitätsklinik
furt hatte Steve Johnson die Gelegenheit,
die
Frank-
Entwick-
lung von MicroMUMPS weiter zu betreiben. Diese Implementierung ist aus den oben genannten Gründen nicht nur beispielhaft für den Mikrocomputern, sondern kann eine Implementierung auf werden hier
Einsatz ebenso
größeren
größtenteils
die
von
als
MUMPS
auf
Beispiel
für
Rechnern
gleichen
dienen. Es
oder
ähnliche
Spracherweiterungen verwendet, wie sie auch in DSM gital Standard MUMPS), der am häufigsten plementierung von
MUMPS
auf
(Di-
benutzten
Minicomputern,
Im-
benutzt
werden. Wir wollen hier die
implementierungsabhängigen
tensweisen der genannten Installation sind die Befehle oder Teile
Verhal-
beschreiben.
von Befehlen, die
Das
nicht im
Standard definiert sind und daher im übrigen Teil dieses Manuskripts nicht berücksichtigt werden konnten. Nachdem CP/M einmal in
einer
unterschiedlichen Art geladen
von
Rechner
wurde,
preter durch die Eingabe des Wortes Er wird als
erstes nach
Uhrzeit fragen, da diese
dem
zu
wird 'MUMPS' für
Inter-
gestartet.
laufenden Datum
Parameter
Rechner
der
die
Variable $HOROLOG benötigt, aber von CP/M nicht
und
der
spezielle bereit-
gestellt werden. Nach einer kurzen
identifizierenden
Meldung
erscheint
der Prompt, der bei dieser MUMPS-Version durch das ßer-Zeichen'
'Grö-
(>) dargestellt wird. Jetzt kann der MUMPS-
Interpreter wie gewohnt
benutzt
werden.
Eine
Sitzung
212
MUMPS auf Mikrocomputern
wird mit dem Befehl HALT
beendet. Wenn man
ausschaltet, ohne HALT gegeben zu
haben,
den Rechner können
schon
durchgeführte Änderungen von Globais verloren gehen. Nach Erscheinen
des
Prompts
können
MUMPS-Befehle
Direktmodus eingegeben werden. Insbesondere
können
im mit
dem DO-Befehl Programme gestartet werden. Wie aber
kann
man selbst
sagt
Programme
abspeichern?
Der
Standard
hierüber nichts aus. MicroMUMPS erkennt
Zeilen,
die
abgespeichert
werden
sollen, daran, daß ihr 'line Start indicator 1 , also Zeichen, das Label und Programmzeile
trennt,
Zeichen (an manchen Terminals Control-I) Wenn in der Eingabe ein
ein
das Tab-
ist.
Tab-Zeichen nach dem Label oder
- wenn kein Label vorhanden ist - am
Zeilenanfang
taucht, wird die Zeile nicht direkt ausgeführt, im Routine-Speicher abgelegt.
auf-
sondern
Wenn schon mehrere Zeilen
abgespeichert sind, wird die Position der neuen Zeile in der vorhandenen Routine
durch
einen Textzeiger
festge-
legt, der die Zeile einer Routine bezeichnet, die gerade geändert werden soll. Die genaue Beschreibung haltens dieses Textzeigers
des
Ver-
würde in diesem Zusammenhang
zu weit führen. Wir verweisen daher auf das zusammen mit MicroMUMPS versandte Benutzermanual. Wenn man ein Programm im lokalen Routinespeicher gestellt hat, kann man es
fertig-
mit dem ZSTORE-Befehl auf der
Platte festhalten. Andernfalls würde
es
überschrieben,
wenn eine andere Routine geladen wird. Der ZSTORE-Befehl ist ein Beispiel für einen
implementierungsspezifischen
Z-Befehl. Es wird ihm der Name, den die Routine
bekommen
soll, als Argument übergeben. Das Gegenstück zu ZSTORE ist ZLOAD.
Mit
diesem
Befehl
kann eine Routine in den Routinespeicher geladen werden,
MUMPS auf Mikrocomputern ohne ihr die Programmsteuerung zu übergeben
213
(das
würde
bei Verwendung des Befehls DO "... geschehen). Wenn ein Programm geladen hat, kann listen oder
modifizieren.
man sie mit
Dazu
man
ZPRINT auf-
stehen
Befehle
ZINSERT, ZMOVE und ZREMOVE zur Verfügung. Die
wie
geänderte
Version muß wieder mit ZSTORE abgespeichert werden. Natürlich gibt es auch einen Befehl, um Routinen von der Platte zu löschen. Das geschieht mit ZDELETE. Die Z-Befehle sind
nicht die einzigen
abhängigen Befehle, die MUMPS kennt. BREAK. Der Standard erlaubt
ein
implementierungsEin
Beispiel
Argument,
das
nicht weiter spezifiziert wird. In MicroMUMPS BREAK-Argument bei der
ist
jedoch
wird
das
Bearbeitung des Befehls ausgege-
ben. Das bietet die Möglichkeit einer Identifikation des Befehls, die dann sehr nützlich sein kann, wenn
mehrere
BREAK-Befehle in einem Programm enthalten sind. Auch der Befehl
zur Fortsetzung der
Programmabarbeitung
nach einem BREAK ist im Standard nicht definiert. MicroMUMPS benutzt hierzu den ZGO-Befehl. Der VIEW-Befehl wird in MicroMUMPS zur Ausgabe dener Listen benutzt. So liefert
VIEW 0
verschie-
(oder
einfach
VIEW) eine Liste aller definierten lokalen Variablen mit ihren Werten. VIEW 1
listet
zusätzlich noch indizierte
lokale Variablen mit ihren Indizes auf. VIEW 2 erzeugt
eine
Liste
der
definierten
globalen
Variablen, während VIEW 3 eine Liste der auf der
Platte
gespeicherten Routinen ausgibt. Bei der Auslieferung von MicroMUMPS ist eigentliche Interpreter auf dern auch noch eine Reihe
der
nicht
wichtigsten kurz vorstellen.
der
Floppy enthalten, son-
von sehr nützlichen
geschriebenen Dienstprogrammen.
nur
Wir
wollen
in MUMPS hier
die
214
MUMPS auf Mikrocomputern
Wie schon an anderer Stelle
dargestellt,
erlauben
Befehle zum Verändern von Programmen nur sehr te und teilweise mühselige
die
beschränk-
Editierungsoperationen.
Ab-
hilfe schafft das Programm iEDIT. Damit können Programmänderungen
komfortabler
und
flexibler
durchgeführt
werden. Das Programm selbst wird nur
einmal
lation von MUMPS aufgerufen.
Es
namens *%, der
nach
erzeugt
der
Instal-
einen
Global
das eigentliche Editierungsprogramm
hält. Es wird mittels XECUTE stützt die Editierung
aufgerufen
und
des im Routinebuffer
ent-
unter-
befindlichen
Programms. Um einiges weniger komplex aufgebaut
ist
das
iDATE. Es dient zur Konvertierung des in der
Programm speziellen
Variablen $HOROLOG enthaltenen Datums in eine klar bare Form. Das
Ergebnis wird
in
die Variable
les-
JDT ge-
stellt. Zur Programmdokumentation ist erstellt eine
%INDEX
Querverweisliste,
sehr nützlich. Es
die
angibt,
Variable an welcher Stelle in welcher Routine
welche angespro-
chen wurde. Dieses Programm benutzt diverse andere tinen als Unterprogramme, deren alle anführen wollen.
Gleichzeitig
der Querverweisliste wird der untersuchten
Namen
eine
Programme
ilNDEX auch als Hilfsprogramm
wir
mit
Rounicht
der Erstellung
Überprüfung
durchgeführt. zur
hier
der Syntax Daher
ist
Programmverifikation
sehr nützlich.
Wir wollen im folgenden kurz beschreiben, wie ein
Inte-
ressent, der bereits ein CP/M-System besitzt, die MicroMUMPS Software bekommen kann. Er muß bereits Mitglied der
MUG Europe sein
den). Dann kann er von der MUG Europe
(oder wer-
(Adresse
im
An-
MUMPS auf Mikrocomputern hang) einen Vertrag anfordern, den er duellen Daten seines
mit
den
indivi-
Rechners ausfüllt und unterschrie-
ben zurückschickt. Nach Eingang der
Zahlung
erhält
eine Floppy mit der für sein System geeigneten sowie die notwendige
215
er
Software
Dokumentation.
Zu erwähnen bleibt noch,
daß
MicroMUMPS
sehr
günstig
erhältlich ist, da es im öffentlichen Bereich entwickelt wurde und nur sind.
die
Vervielfältigungskosten
zu bezahlen
Anhang
I
Zusammenfassung der Sprache Übersicht über Befehle Übersicht über Funktionen Übersicht über spezielle Variablen Übersicht über Operatoren
II
Übersicht über den neuen Standard
III
Verzeichnis der ASCII-Zeichen
IV
Literaturverzeichnis
V
Adresse der MUMPS Users 1
Group
218
Anhang I
Übersicht über Befehle
Übersicht Uber Befehle
BREAK BREAK
BREAK suspendiert die Ausfüh-
B: COND
rung des gerade laufenden Programms solange, bis ein (herstellerabhängiges)
spezi-
zielles Signal empfangen wird. Auch die Angabe von Argumenten ist herstellerspezifisch. CLOSE CLOSE "DEV",3
CLOSE kann mit und ohne
C:BED>3 GER
Argument benutzt werden. In der
C TTY:(Geräteparameter)
Form mit Argument werden alle als Argument(e) angegebenen, in der Form ohne Argument alle Geräte geschlossen. Der Wert von $10 kann dann Undefiniert sein. Dem Argument können herstellerabhängige Geräteparameter folgen. Postconditionalisierung des Befehls und Indirektion sind erlaubt.
Anhang I
Übersicht über Befehle
219
DO DO ROUT,PROG Ä
DO führt die in seiner Argu-
D MOD,A1 '"MODI
mentliste aufgeführten lokalen
D:A=1 PROG:T=1
oder globalen Programme (er-
D §NAM~@B:Z= 5,LAB+B/5
kennbar am Zirkumflex) aus. Postcondition des Befehls und der Argumente sind erlaubt. Die Angabe eines Offsets und Indirektion sind gestattet.
ELSE ELSE
ELSE erlaubt die bedingte Ausführung einer Programmmzeile in Abhängigkeit von dem Testschalter $T. Der dem ELSE folgende Teil der Programmzeile wird nur ausgeführt, wenn $T den Wert 0 hat. ELSE hat keine Argumente. Postconditionalislerung ist nicht erlaubt.
220
Anhang I
Übersicht über Befehle
FOR FOR 1=1:1:10
Der FOR-Befehl bewirkt die
F J=-9:2:5,7,19,36:5:90
wiederholte Exekution des
,I
F K="A ,"BB»,1:2:11,VAR
diesem Befehl folgenden Teils
F L=1:1
der Programmzeile. Es gibt den
F QL=Qk:@B:§C
Befehl in drei Formaten. Im Bereichsformat wird eine Laufvariable von einem Startwert an jeweils um das Inkrement erhöht, bis ein Endwert erreicht ist. Im Ausdrucksformat wird einer lokalen Variable eine Liste von Werten zugeordnet. In der dritten Form wird der Endwert nicht spezifiziert. QUIT und GOTO beenden jede Form einer FOR-Schleife, jedoch QUIT nur die innerste Schleife einer geschachtelten Konstruktion. Postconditionalisierung ist nicht erlaubt. Die Argumentindirektion ist nicht gestattet, jedoch die Namensindirektion für Variablennamen. Die Laufvariable kann in der Schleife verändert werden, jedoch nicht die FOR-Parameter (Start- und Endwert, Inkrement).
Anhang I
Ü b e r s i c h t über B e f e h l e
221
GOTO GOTO
GOTO u n t e r b r i c h t
die
G LAB+5~PROG:T=1
sequentielle Ausführung
G:T
P r o g r a m m e , und
G
A:S=1,B:S=2
§P:T=1,§A~§B:T=2
der
verzweigt
entweder zu einer
Zeile
d e s s e l b e n P r o g r a m m s , oder zu einer Zeile eines a n d e r e n P r o g r a m m s , jeweils ohne
Rück-
kehr. I n d i r e k t i o n und P o s t c o n d i t i o n a l i s i e r u n g des B e f e h l s und der A r g u m e n t e sind erlaubt. HALT HALT
Mit HALT wird der
aktuelle
H : ABBRUCH
M U M P S - P r o z e ß beendet.
Zuvor
wird a u t o m a t i s c h e i n LOCK und C L O S E jeweils ohne A r g u m e n t d u r c h g e f ü h r t . HALT hat A r g u m e n t und
kein
unterscheidet
sich d a d u r c h vom H A N G - B e f e h l . HANG HANG 10
HANG u n t e r b r i c h t die A u s f ü h -
H:T=1
rung des a k t u e l l e n
H ei
B/4,11.7
Prozesses
für eine im A r g u m e n t
angegebe-
ne A n z a h l von S e k u n d e n .
Post-
c o n d i t i o n des B e f e h l s und Indir e k t i o n sind erlaubt. S o l l das P r o g r a m m portabel sein, muß das A r g u m e n t g a n z z a h l i g
sein.
222
Anhang I
Übersicht über Befehle
IF IF T=1
IF erlaubt die bedingte II
I S=1,U= JA"
Ausführung einer
I
Programmzeile. IF in der
I @C!@D
argumentlosen Form führt den Rest der Zeile nur aus, wenn $T=1 ist. In der Form mit Argument wird der Rest der Zeile dann ausgeführt, wenn die logische Interpretation des Arguments wahr (also 1) ist. Der Wert von $T kann verändert werden.
Argumentindirektion
kann benutzt werden. Die Postcondition ist nicht erlaubt. JOB JOB "A
JOB bewirkt, daß einer oder
J B,A1TROG
mehrere parallele MUMPS-Prozes-
J:G="WAHR" J1::10
se vom aktuellen Programm ge-
J §VAR:(JOB-Parameter)
startet werden. Als Argument wird der Einsprungpunkt einer Routine angegeben. Postconditionalisierung des Befehls, die Argumentindirektion und die Angabe eines Timeouts sind möglich.
Herstellerabhängige
Prozeßparameter stehen in Klammern.
Anhang I
Übersicht über Befehle
223
KILL KILL
In der argumentlosen Form
K A,B,"C
löscht KILL alle lokalen
K A(1,3)
Variablen, in der selektiven
K
Form nur die, die als Argumente
(V1,V2,V3)
K:BED P1,P2,§VAR&(IND)
angegeben sind und in der exklusiven Form alle außer denen, die in Klammern stehen. Ein KILL auf einen Knoten einer indizierten Variablen bewirkt das Löschen des Knotens und aller Nachfolger. Globale Variablen können nur mit der selektiven Form gelöscht werden. Indirektion und Postconditionalisierung sind erlaubt. KILL kann $DATA verändern.
224
Anhang I
Übersicht über Befehle
LOCK LOCK wird vorwiegend zum Sper-
LOCK Ä
L A, G
ren von globalen Variablen be-
L A(1,2)
nutzt,um sie als Eigentum eines
L (B,C,*H):10
MUMPS-Programms zu deklarieren.
L SUB(I,12),gl,gU@(S)
Ein LOCK entsperrt immer alle früher gesperrten Variablen, während LOCK mit geklammerten Argumenten alle angegebenen Variablen zusammen sperrt. Indirektion und Timeout sind erlaubt. Der 'naked Indikator' wird nicht verändert. Der LOCK auf einen Knoten einer indizierten Variablen bewirkt das Sperren dieses Knotens und aller Nachfolger. Nachbarknoten sind nicht betroffen.
OPEN OPEN DEV
Der OPEN-Befehl dient zum Öff-
0 3,PRNT::TIME
nen eines Geräts. Seine Aus-
Os'CLOSED gBAND
führung bewirkt die logische
0 TERM:(Parameter):20
Verbindung zwischen Programm und Gerät. Er reserviert das Gerät für dieses eine Programm. Timeout und Indirektion sind gestattet, ebenso Postconditionalisierung des Befehls. Herstellerabhängige Angaben stehen in Klammern.
Anhang I
Übersicht über Befehle
225
QUIT QUIT
QUIT beendet die jeweils inner-
Q:T=10
ste FOR-Schleife, sowie Programmteile, die mit DO oder XECUTE aufgerufen wurden. QUIT enthält kein Argument. Postconditionalisierung
darf
benutzt werden.
READ READ X
READ weist lokalen Variablen
R "Wohnort—",W0
von einem Eingabegerät aus
R *Z,*A
Werte zu. Ein Stern vor dem
R:$D(G)
!,"Daten?-",D:10 Namen bewirkt die Interpretie-
R §A#15:10
rung des Eingabewertes als ASCII-Code. Timeout ist ebenso erlaubt, wie Indirektion und Postconditionalisierung. Angabe einer
Die
Längenbegrenzung
der Eingabe ist möglich.
226
Anhang I
Übersicht über Befehle
SET SET X=5 S
Ä
FILE=3>NEU(1)="ABC"
SET ist neben READ die einzige Möglichkeit, Variablen Werte
SsA>0 (I,J,K) = 1
zuzuweisen. Eine Zuweisung
S -A(5)=1,C("(3))=0
eines Wertes an mehrere
S §A=@B+1
Variablen wird durch Klammerung
S $PIECE(V,"*",3)="A"
der Variablen erreicht.
S:X=3 X=4.5
Postconditionalisierung und
S X=X=3*1.5+X
Indirektion sind erlaubt. Grundsätzlich wird der zuzuweisende Ausdruck rechts des Gleichheitszeichens zuerst berechnet, es sei denn, es erscheinen Indizes auf der linken Seite. Die konkrete Auswertung des Befehls kann sehr unüberschaubar werden, wenn 'naked reference' benutzt wird. Will man Teile eines Strings ersetzten, benutzt man SET $PIECE. Die beiden letzten Beispiele sind äquivalent.
USE USE 3
USE wird in Verbindung mit dem
U:STATUS="OPEN" GER
OPEN-Befehl benutzt, um ein
U 3:(Geräteparameter)
Gerät zum aktuellen
U §GER
Ein-Ausgabegerät zu machen. Herstellerabhängige Geräteparameter sind möglich. Postconditionalisierung und Indirektion sind erlaubt.
Anhang I
Übersicht über Befehle
227
VIEW VIEW (Argumente)
VIEW gibt den Herstellern die Möglichkeit,
implementierungs-
abhängige Abfragen zu gestatten. Die Verwendung dieses Befehls ist strikt herstellerabhängig, und sollte bei portablen Programmen nicht verwendet werden. WRITE WRITE "HALLO"
Der Write-Befehl dient zum
W # I ? 10, * 7
Ausgeben von Texten auf das
W:»T A,B,! I,C+T/5_S
Hometerminal oder dem mit USE
W §A,§§V
spezifizierten Gerät. Ein * signalisiert die Ausgabe des ASCII-Äquivalents. Die Formatkontrolle ist mit #,!,? möglich. Indirektion und Postconditionalisierung möglich.
ist
228
Anhang I
Übersicht über Befehle
XECUTE XECUTE A,~B
Der XECUTE-Befehl dient zum
X "S X=1"
Ausführen einer
Zeichenkette
X:T["abc" T(I,2)
als einzeiliges
Unterprogramm.
X gA_"X @B"
Geschachtelte X-Konstrukte sind ebenso erlaubt, wie die Verwendung der Postcondition beim Befehl und den Argumenten und die Indirektion. Ein QUIT beendet XECUTE.
Z Z_(herstellerabhängig)
Z-Befehle sind herstellerabhängige Erweiterungen des MUMPS-Befehlssatzes, die nicht bei portablen Programmen benutzt werden sollten.
Anhang I
Übersicht über Funktionen
229
Übersicht über Funktionen
$ASCII W $ASCII("A")
$ASCII wählt aus einem String
65
ein Zeichen, und gibt den
W $A("ABC",3)
ASCII-Code dieses Zeichens. Das
67
zweite Argument gibt die 11
W $A( " )
Position des Zeichens an. Fehlt
- 1
es, wird das erste Zeichen der Zeichenkette
genommen.
$CHAR W $CHAR(65)
$CHAR ist die inverse Funktion
A
zu $A. Aus einer ganzen Zahl
W $C(65,66)
wird das Zeichen, dessen
AB
Zeichencode sie repräsentiert.
W $C(-1)
Negative Argumente sind
(der Leerstring)
zugelassen, ergeben aber keinen Wert.
230
Anhang I
Übersicht über Funktionen
¿DATA
W $DATA(D(5,6))
$DATA gibt eine Zahl, die
0, 1, 10, oder 11
angibt, ob eine als Argument angegebene lokale oder globale Variable existiert und welche Datenstruktur vorliegt. Ist das Ergebnis eine 0 oder 10, enthält der Knoten keine Daten, im letzten Fall hat er aber Nachfolger. Ist das Ergebnis 1 oder 11, enthält er Daten und hat im letzten Fall einen Nachfolger.
$EXTRACT
W $EXTRACT("ABC")
$EXTRACT übergibt einen
A
Teilstring des ersten Arguments
W $E("XYZ",2)
der Funktion, dessen Anfang und
Y
Ende durch das 2. und 3*
W $E("AABB",2,3)
Argument festgelegt wird. Sind
AB
diese nicht spezifiziert, wird das 1. Zeichen extrahiert.
Anhang I
Übersicht über Funktionen
231
¿FIND W $FIND("ABC","A")
$FIND übergibt die Endposition
2
eines Suchstrings plus 1
W $F("XYZ","T")
innerhalb einer Zeichenkette.
0
Wird dieser Suchstring nicht
W $F("ABABAB","AB",3)
gefunden, ist der Wert der
5
Funktion 0. Ein dritter Parameter gibt die Position, ab der gesucht werden soll. Die Position der leeren Zeichenkette "" ist stets 1.
•JUSTIFY W $JUSTIFY(12,3) 12
$JUSTIFY ermöglicht das rechtsbündige Ausrichten von
W $J("Text",10) Text
Datenfeldern, sowie die Angabe, wie eine Zahlenangabe
W $J(12,3,2)
auszusehen hat. Der 2.
12.00
Parameter gibt die Länge der
W $J(3.14,1,0)
Ausgabe an. Unterschreitet
3
diese Angabe die Länge des
W $J(0.414,6,3)
Datenfeldes, bleibt es
0.414
unverändert. Das 3« Argument spezifiziert die Formatierung von numerischen Datenelementen. Damit ist die Rundung von Zahlen möglich. Führende Nullen werden unterdrückt, es sei denn, die Zahl liegt zwischen 1 und -1.
232
Anhang I
Übersicht über Funktionen
$LENGTH W $LENGTH("ABCD")
$LENGTH gibt die Länge einer Zeichenkette. Die Länge des
W $L("" )
Leerstrings ist 0. Die Angabe
0 W $L( "AB CD EF"
einer Zeichenkette als 2. 11
)
3
Argument bewirkt die Übergabe der Häufigkeit ihres Vorkommens plus 1 im Gesamtstring.
$NEXT S V("A")= 1 W $N(V(-1 ) )
Die Funktionen $NEXT und $ORDER sind in ihrer Wirkungsweise völlig gleich, bis auf den Start- und Endwert von $N, der -1 beträgt. $N wurde zur Aufwärtskompatibilität beibehalten, nachdem beliebige Zeichenketten als Indizes zugelassen wurden.
Anhang I
Übersicht über Funktionen
233
¿ORDER S
(A(-1),A(0))=1
Mit $0RDER ist man in der Lage,
S
(A(1),A("Z"))=1
sämtliche Indizes einer
W $ORDER(A(""))
indizierten Variablen gemäß
- 1
der Sortierreihenfolge zu
W $0(A(-1))
ermitteln. Der Start- und
0
Endwert ist der Leerstring. Man
W $0(A(1))
beachte, daß der 'naked
Z
indicator' verändert werden
W $0(A("Z"))
kann.
(leere Zeichenkette) ¿PIECE S V="ABC\XYZ\123"
$PIECE sucht nach einem Teil-
W $PIECE(V,"\")
string (2.Argument) in einem
ABC
gegebenen String
W $P(V,"\",2)
und liefert die Zeichenkette
(I.Argument),
XYZ
bis zu diesem Teilstring. Wird
W
der Teilstring nicht gefunden,
$P(V,,2,3)
XYZ\123
ist das Ergebnis ein Leerstring
S $P(V,,2)="xyz" W V
Die Angabe eines 3. und 4.
ABC\xyz\123
Arguments spezifiziert die
(vergl. auch SET-Befehl) Position der Zeichenkette. ¿RANDOM W $RAND0M(10) 5
Ist das Argument von $RAND0M n, dann liefert die Funktion eine ganzzahlige Zufallszahl im Bereich 0 bis n-1.
234
Anhang I
Übersicht über Funktionen
¿SELECT S A=1
Jedes Argument von $SELECT ist
W $SELECT(A=1: 5,A>1: 0)
ein geordnetes Paar von 1.
5
einem logischen Ausdruck und
W $S(A=2:5,1:0)
2. einem Ausdruck, getrennt durch einen Doppelpunkt. Die
0
Interpretation der Argumente wird von links nach rechts ausgeführt bis ein logischer Ausdruck wahr ist. $S liefert dann den Wert rechts des Doppelpunktes .Mindestens ein logischer Ausdruck muß wahr sein. •TEXT W $TEXT(+0)
$TEXT(+0) liefert den Namen des
ROUT
aktuellen Programms. Ist das
W $T(+5)
Argument eine positive ganze
READ X WRITE X+1
Zahl mit einem führenden Plus-
W $T(LAB)
zeichen, wird die entsprechen-
LAB READ B
de Programmzeile des Programms
W $T(LAB+1)
ausgegeben. Im anderen Fall ist
SET A=3
das Argument eine Zeilenreferenz (Label oder Label plus Offset), wobei $TEXT den Inhalt dieser Zeile übergibt. Existiert die Zeilenreferenz nicht, ist das Ergebnis ein Leerstring
Anhang I
Übersicht über Funktionen
235
•VIEW $VIEW(Argument imple-
$VIEW ist eine herstellerab-
mentierungsabhängig)
hängige Funktion, die dem Programm systemabhängige Daten übergibt. Portable Programme sollten $V nicht enthalten.
•Z $Z_(Rest des Namens
Jede zusätzliche, nicht im
und Argument
Standard enthaltene Funktion,
herstellerabhängig)
die ein Hersteller definiert, soll mit $Z beginnen. Portabel geschriebene Programme sollten von diesen Erweiterungen keinen Gebrauch machen.
236
Anhang I
Übersicht über spezielle Variablen
Übersicht Ober spezielle Variablen
•HOROLOG W $HOROLOG
$H0R0L0G enthält das Datum und
51797,57754
die Uhrzeit in Form von 2
W $P($H,",",2)
Zählern, die durch ein Komma
57800
getrennt sind. Der erste Zähler gibt die Anzahl von Tagen seit dem I.Januar
1841,
der 2. Zähler die Anzahl der Sekunden seit Mitternacht. $10 U "TERM" S X=$I0 W X
$10 gibt den Namen des aktuell
TERM
benutzten Ein- oder Ausgabegerätes an. $10 wird oft benutzt, um temporäre Dateien eindeutig zu indizieren.
$JOB W $ JOB 1024
$JOB enthält eine positive ganze Zahl, die jeden laufenden MUMPS-Prozeß eindeutig identifiziert. $J0B kann zur eindeutigen Indizierung von globalen Variablen benutzt werden.
Anhang I
Übersicht über spezielle Variablen
237
•STORAGE W ^STORAGE
$ST0RAGE ist ein Maß für die
769
Größe des noch zur Verfügung stehenden Speicherplatzes. $S ist stark herstellerabhängig.
$TEST IF A=5 S X=1 W $TEST
$TEST enthält den Wert des
1
zuletzt berechneten
(falls A gleich 5)
0 "FLOPPY":: 10 W $T 1
(falls FLOPPY in 10 sek. offen)
Testschalters. $T wird gesetzt bei IF mit Argument, sowie bei den Befehlen OPEN, LOCK, READ und JOB mit
Timeout.
Argumentloses IF und ELSE verändern den Wert von $T nicht. •X W ?5,$X 5
$X gibt die Position des Zeichens an, das innerhalb einer Zeile als nächstes gedruckt wird. Am Zeilenbeginn hat $X den Wert 0. Formfeed und Linefeed setzen den Wert von $X auf 0.
238
Anhang I
W it M ! , $ Y 3
Übersicht über spezielle Variablen
$Y enthält die vertikale Position des aktuellen EinAusgabegerätes an. Die erste Zeile ist als 0 definiert. Ein Formfeed setzt $Y auf 0. Jedes nachfolgende Linefeed erhöht den Wert von $Y um 1.
Jede
herstellerspezifische
Erweiterung der speziellen Variablen muß mit $Z beginnen. Programme, die herstellerunabhängig
sein
müssen, sollten $Z nicht benutzen.
Anhang I
Übersicht über Operatoren
239
Übersicht Uber Operatoren In MUMPS sind folgende Operatoren definiert: Zweistellige _
Stringoperatoren
Konkatenation
StringVergleichsoperatoren =
Gleichheit
]
Folgt
[
Enthält
?
Mustervergleich
Logische Vergleichsoperatoren und der NICHT-Operator &
UND
•
NICHT
Arithmetische
Zweistellige arithmetische
Größer Operatoren
+ *
Addition Multiplikation
/
Subtraktion Division
#
Restdivision
\
Ganzzahldivision
Einstellige arithmetische +
Plus
Operatoren -
Minus
Der Wertebereich eines Operators hängt
von
seinem
Typ
ab. Arithmetische Operatoren sind auf numerischen Werten
240
Anhang I
Übersicht über Operatoren
definiert, Vergleichsoperatoren
auf
und Stringoperatoren auf beliebigen
Booleschen
Zeichenketten.
züglich der Interpretation von Werten gibt generelle Regel: alle Booleschen Werte Zahlen interpretierbar, alle rische Werte und alle
ganzen
numerischen
Werten
es
sind
als
ganze
Zahlen
als
nume-
Werte
als
Zeichen-
ketten. Umgekehrt können Zeichenketten mit dem in tel 1.5.2 angegebenen Regeln als numerische Werte
als
numerische
Boolesche
Be-
folgende
Werte
Kapi-
Werte
und
interpretiert
werden. Der NICHT-Operator hat
bezüglich
einer beliebigen Ver-
gleichsoperation folgende generelle Wirkung: A'B
ist äquivalent
'(AB).
Zwischen den zweistelligen und den
Vergleichsoperatoren
gibt es keine Hierarchie. Hier gilt die
strikte
links-
nach-rechts Abarbeitung.
Konkatenation Die Wirkung dieser
Operation
besteht im Zusammenketten
zweier Zeichenketten zu einem einzigen String. Sei X= 11 12" Ausdruck
Wert
"AB"_"CD"
ABCD
"AB"_X
AB 12
"AB" ""
AB
Anhang I
Übersicht über Operatoren
3_4
34
2*3_4
64
2«(3 1)
68
241
Stringvergleichsoperatoren Der Vergleichsoperator = vergleicht auf Gleichheit, der
zwei
Enthält-Operator
Zeichenketten
[ entscheidet, ob
die rechte Zeichenkette in der linken enthalten ist der Folgt-Operator
] entscheidet, ob der
linke
und
Operand
dem rechten in der lexikografischen Reihenfolge folgt. Sei X=3,Y= I, A ,, ,Z= ,I 3.0" Ausdruck
Wert
X=A
0
X=Z
0
Z=(X ».0») "ABC"[Y X_Y[ 3 X[Y_3
03
X]Y
0
Y]X Z](X=Y)
Mustervergleich Der Mustervergleich
entscheidet,
ob
eine
vorgegebene
Zeichenkette dem Muster entspricht, das rechts neben dem
242
Anhang I
Übersicht über Operatoren
Operator angegeben ist. Das
Muster
besteht
aus
einem
Wiederholungsfaktor und der Angabe, aus welcher Zeichenmenge des
ASCII-Zeichensatzes
es
besteht.
Neben
der
Abfrage auf Zeichenarten kann auf das Vorhandensein
von
festen Zeichenketten geprüft werden, indem man diese Vergleichsteil in Anführungszeichen
setzt.
Zuweisung
Ausdruck
SET G="12.12.82"
G?. N
0
G?6N
0
G72N1P2N1P2N
1
G?.NP
1
G?.N1"."5NP
1
G?.9E
0
SET N="texttext"
SET C=*7 "A"
im
Wert
N? . L
1
N?2"TEXT"
0
N?2"text"
1
N?1.1 OL
1
N?1"text"3.L
1
C71C1U C?1.5CUL C? 3 • E
Logische Vergleichsoperatoren Die logische UND-Verknüpfung
(&) ist
genau
dann
wahr,
wenn beide Operanden wahr sind, die ODER-Verknüpfung ist wahr, wenn wenigstens
ein
Operand
wahr
ist.
NICHT-Operator als einstelliger logischer Operator vertiert den logischen
Wert
seines
Operanden
in
(!) Der kondas
Anhang I
Übersicht über Operatoren
logische Gegenteil. Der NICHT-Operator dung mit allen arithmetischen
1
243
kann in Verbin-
Vergleichsoperatoren
und
Stringvergleichsoperatoren benutzt werden. Sei L=0,M=1 Ausdruck
Wert
(L=1)&(M=1)
0
(L=1)!(M=1) '(L=1)&(M=1) L=1 1 &(M=1) L=0&'M 1 =1
Arithmetische
Vergleichsoperatoren
Diese beiden
Operatoren
vergleichen
Werte auf größer oder kleiner.
Bei
zwei
numerische
diesen
Vergleichen
werden die Operanden zunächst in numerische vertiert, ehe der Vergleich ausgeführt wird. Sei Y=12,Z=15 Ausdruck
Wert
Y"1.6E1"
0
Z'>Y_Z
015
Y=Z