Einführung in die Programmiersprache MUMPS 9783111655819, 9783110097467


217 71 8MB

German Pages 272 [276] Year 1983

Report DMCA / Copyright

DOWNLOAD PDF FILE

Table of contents :
Geleitwort
Vorwort
Inhalt
1. Einführung in die Grundbegriffe
2. Die Steuerung des Programmflusses
3. Textverarbeitung mit MUMPS
4. Die Struktur der Variablen
5. Fortgeschrittene Programmiertechniken
Anhang
Sachregister
Recommend Papers

Einführung in die Programmiersprache MUMPS
 9783111655819, 9783110097467

  • 0 0 0
  • Like this paper and download? You can publish your own PDF file online for free in a few minutes! Sign Up
File loading please wait...
Citation preview

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