FirstStep - Eine Ausbildungssprache

Inhalt

  1. Die Struktur von FirstStep
  2. Link-Definitionen
  3. Schreibweise
  4. Blöcke
  5. Definitionen
  6. Deklarationen
  7. Anweisungen
  8. Funktionen und Prozeduren
  9. Klassen
  10. Ein- und Ausgabe, Dateien und Verbindungen
  11. Syntax

    Anhang:

  1. Beispiele
  2. Module
  3. Dokumentation zu FirstStep in Word 6.0
    Dokumentation zu FirstStep in Word 7.0
    Dokumentation zu FirstStep in PostScript

zurück Index vor

6 Deklarationen

6.1 Allgemeines

Deklarationen werden durch das Schlüsselwort declare (im Hauptprogramm durch DECLARE) eingeleitet. Deklarationen werden durch ";" getrennt aufgelistet:

Deklarationen bewirken die Deklaration bzw. Instanziierung von Objekten. Eine deklaration hat das Format:

Dabei ist wert von typangabe abhängig, d.h. die dort stehende Konstante bzw. der Konstantenausdruck muß einen Wert entsprechenden Typs ergeben.

6.2 Einfache Typen

FirstStep kennt die folgenden einfachen Typen, die hier in einer Beispieldeklaration aufgelistet werden:

Diese Objekte können auch konstant sein, z.B.:

Konstante Objekte besitzen keine Adressen. Sie können also vom Compiler statt der Namen in das Programm eingesetzt werden.

Auf analoge Weise können die Werte von Variablen initialisiert werden.

Die Angabe typangabe object(wert) mit dem Schlüsselwort object erzeugt ein Objekt des angegebenen Typs und initialisiert es mit dem angegebenen Wert. Als Ergebnis liefert dieser Ausdruck die Adresse dieses Objekts zurück. Ergibt sich der Typ aus dem Kontext (im Beispiel real), so kann die Typangabe vor object entfallen.

6.3 Strukturierte Typen

An strukturierten Objekten gibt es Texte, Felder und Records sowie Klasseninstanzen.

Es gibt drei verschiedene Arten von Texten, die wir wieder in Beispien einführen:

Texte können feste oder variable Längen haben; bei variabler Länge wird in der Regel bei jeder Kopieroperation neuer Speicherplatz alloziiert, so daß dieses sehr laufzeitaufwendig ist. Dafüer können keine Bereichsüberschreitungen auftreten, so daß dieses sehr sicher ist.

Texte haben im Prinzip alle verschiedenen Typ, sind jedoch bezüglich Kopier- und Vergleichsoperationen kompatibel, auch wenn sie sich evtl. in der Anzahl der Zeichen unterscheiden. Somit kann ein Text auf einen anderen Text fester Länge kopiert werden, wenn er nicht länger ist als dieser. Der Rest wird durch das NUL-Zeichen (0016) aufgefüllt. Zur effizienteren Verarbeitung wird hinter jedem Text das NUL-Zeichen eingefügt, so daß Texte in der Regel ein Byte mehr Speicher belegen als angegeben.

Für Texte sind die Operationen: Kopieren (mit Einfügen, Ausschneiden und Anhängen) sowie Vergleichen definiert:

Beispiel

Ein Feld wird durch den Typ seiner Komponenten sowie durch seine Ausdehnung spezifiziert.

Bei der Initialisierung eines Feldes wird zuerst der hintere Index variiert; da der erste Index bei einer Matrix den Zeilenindex angibt, werden Felder also zeilenweise initialisiert:

Die Punktnotation Von .. Bis ist äquivalent den Werten: Von, Von+1, Von+2, ..., Bis-1, Bis.

Datensätze oder Records werden durch Auflistung ihrer Komponenten zwischen den Schlüsselwörter record und end record spezifiziert. Für Records gilt beispielsweise:

Diese Deklaration erzeugt einen Datensatz mit drei Einträgen. Auch hier ist eine Initialisierung möglich, die wahlweise explizit:

oder kompakt durchgeführt werden kann:

Die folgenden Beispiele zeigen die Deklaration von Bitfeldern und Mengen:

Bitfelder und Mengen müssen als Bitfolgen implementiert werden und verlangen die folgenden speziellen Operatoren:

Bedeutung Mengennotation Operation auf Menge Operation auf Bitfeld
Ist Element Element Î Menge Element == Menge BitFeld[Nr] == 1;
In Menge {Element} È Menge Menge + Element BitFeld[Nr] := 1;
Aus Menge Menge | {Element} Menge - Element BitFeld[Nr] := 0;
Gleichheit Menge1 = Menge2 Menge1 == Menge2 BitFeld1 == BitFeld2
Ungleichheit Menge1 != Menge2 Menge1 <> Menge2 BitFeld1 <> BitFeld2
Teilmenge Menge1 Ì Menge2 Menge1 < Menge2 BitFeld1 < BitFeld2
Vereinigung Menge1 È Menge2 Menge1 + Menge2 BitFeld1 or BitFeld2
Durchschnitt Menge1 Ç Menge2 Menge1 * Menge2 BitFeld1 and BitFeld2
Differenz Menge1 — Menge2 Menge1 - Menge2 BitFeld1 - BitFeld2
symm. Differ. Menge1 D Menge2 Menge1 / Menge2 BitFeld1 xor BitFeld2
schieb n rechts BitFeld1 + Nr
schieb n links BitFeld1 - Nr

Man beachte, daß es sich hier jeweils um eine Wertesemantik handelt,d.h. daß die Typgleichheit vorausgesetzt wird. Beispielsweise bedeutet Menge1  ==  Menge2, daß beide vom gleichen Mengentyp sind, beispieslweise Farben set. Enthalten dann beide Mengen genau die gleichen Elemente, so ist das Ergebnis "wahr", sonst falsch. Ebenso müssen zwei Bitfelder von gleichem Typ sein, also insbesondere beide den gleichen Indexbereich haben.

Mengen können explizit angegeben werden, indem ihre Werte in geschweifte Klammern aufgezählt werden:

wobei auch eine Punktnotation zulässig ist:

Hierbei muß die Menge in der jeweiligen Umgebung eindeutig aus dem Kontext herleitbar sein. Ähnliches gilt für Bitfelder:

Somit wird 0..0 mit so vielen Nullen aufgefüllt, bis der Ausdruck in der Länge mit dem des Kontexts übereinstimmt; analoges gilt für 1..1.

Dateien werden mit dem Schlüsselwort file deklariert:

Es handelt sich bei Dateien logisch um Textobjekte, die eine beliebige Anzahl von Zeichen aufnehmen können. Allerdings können Zeichen nur geschrieben werden, wenn die Datei zum Schreiben geöffnet wurde, und sonst nur gelesen werden. Genaueres hierzu siehe Abschnit 11.

6.4 Erweiterter Zugriff auf Objekte: disclose

Durch das Schlüsselwort disclose läßt sich ein Klassenobjekt oder ein Datensatz dereferenzieren, so daß dessen (öffentlichen) Objekte in der jeweiligen Umgebung bekannt sind.

Dieses muß jeweils vor einer Deklaration in einer eigenen Abteilung geschehen, wobei jedoch mehrere Datenobjekte geöffnet werden können.

Ist ClassName eine Klasse (d.h. eine Typbeschreibung), so sind alle Namen aus ClassName bekannt, jedoch existiert keine Instanz dieser Klasse. Werden diese benötigt, so kann man schreiben:

Diese Instanz wird am Ende eines Blocks automatisch wieder gelöscht, da es keine Möglichkeit gibt, auf diese darüber hinaus zuzugreifen, und da der Programmierer daher keine explizite Löschfunktion wie dispose aufrufen kann.. Ist ClassObject eine Instanz einer Klasse bzw. eine Referenz auf eine solche Instanz, so wird durch

diese Instanz geöffnet. Ihre Werte können somit innerhalb dieses Blocks verändert werden. Natürlich ist es möglich, eine Referenz auf eine Instanz zu generieren und diese zugleich zu öffnen.

Diese Instanzen können am Ende des Blocks nicht automatisch gelöscht werden, da der Compiler nicht kontrollieren kann, ob auf diese Instanz eine weitere Referenz existiert.

disclose ist der Mechanismus, mit dem FirstStep die Vererbung durchführt, indem eine disclose-Deklaration auf eine Basisklasse innerhalb einer Klasse die Methoden und gegebenenfalls Variablen der Basisklasse einbindet.

Weitere Informationen zu FirstStep finden Sie in dem Buch "System, Model, Programm".

zurück Index vor