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

7 Anweisungen

Anweisungen verändern die Werte eines Objekts durch Zuweisungen und bestimmen die Reihenfolge, in der Zuweisungen ausgeführt werden. Sie bestehen daher aus Zuweisungen und Kontrollanweisungen.

Ein Semikolon trennt zwei Anweisungen; es kann am Ende einer Anweisungsfolge fehlen, wenn dahinter ein anderes Trennzeichen steht, beispielsweise das Schlüsselwort done.

7.1 Zuweisungen und Dereferenzierung

Zuweisungen (genauer k-fache Zuweisungen) haben stets die Form:

objektname ist der Name eines realen Speicherobjekts. Zwar wird der Name des Objekts angegeben, gemeint ist aber stets der Wert, also der Speicherinhalt. Ist das Objekt objektName selbst eine Adresse (d.h. ein Zeiger auf ein Objekt), so ist mit objektName ebenfalls der Wert des Objekts gemeint, das unter der jeweiligen Adresse gefunden wird. Es wird also eine automatische Dereferenzierung durchgeführt. Soll stattdessen eine Adresse kopiert werden, so ist der Zuweisungsoperator ":-" zu verwenden, der unten behandelt wird.

Ähnliches gilt für die Dereferenzierung. Ist das Objekt RefToAlpha eine Adresse auf ein Objekt vom Typ Alphatyp,

so wird mit

auf das entsprechende Objekt von AlphaTyp zugegriffen. Durch die gleiche Notation wird auf ein Objekt RefToAlpha vom Typ ->Alphatyp zugegriffen:

Der Compiler setzt somit beide gleichen Ausdrücke verschieden um. Dieses ist notwendig, da in beiden Fällen aufgrund der Wertesemantik nichts anderes als der jeweilige Wert gemeint sein kann. Auch wenn eine gemischte Zuweisung vorkommt:

so kann nur die Wertzuweisung gemeint sein. Das Objekt, auf welches die Adresse RefToAlpha weist, erhält somit die Werte von Alpha.

Soll eine Referenz zugewiesen werden, so ist dafür ein eigener Operator: ":-" zu verwenden. Die rechte Seite muß dann eine Adresse besitzen (also kann z.B. keine Konstante oder Ausdruck sein), während die linke Seite eine Referenz auf ein geeignetes Objekt identischen Typs sein muß. Es ist nicht zulässig, hier eine implizite Typumwandlung durchzuführen:

Man beachte im letzten Fall, daß jetzt zwei verschiedene Referenzen auf das identisch gleich Objekt existieren. Das kann zu sehr unübersichtlichen und somit fehleranfälligen Programmen führen.

Objekte können einfach sein (skalar) oder komplexe Objekte wie Record, Klasseninstanz, Feld oder Text. Bei komplexen Objekten unterschiedlicher Größe muß der Programmierer beim Kopieren dafür sorgen, daß das Objekt groß genug ist, um den Wert aufzunehmen. Kann die Größe variieren, wie bei Texten, so ist besonders auf die Objektgröße zu achten.

7.2 Ausdrücke

Ein Ausdruck berechnet einen Wert. Ausdrücke sind arithmetische Ausdrücke, welche einen Zahlenwert errechnen, logische Ausdrücke, die einen logischen Wert errechnen, oder andere Ausdrücke.

Arithmetische Ausdrücke verwenden die Operatoren "+", "–", "*", "/", "**", "mod", "rest" und "modrest". Außerdem können Funktionen Zahlenwerte berechnen und als Ergebnis eines Ausdrucks abliefern.

In FirstStep wird ausschließlich Wertesemantik verwendet, d.h. daß stets ein Wert, unabhängig von seiner Repräsentation gemeint ist. Daher haben:

alle den gleichen Wert zwei:

Es müssen somit automatische Typanpassungen und Dereferenzierungen durchgeführt werden. Dieses gilt außer für Instanziierungen auch für Paramter von Prozeduren.

Ein Wert kann ins Leere weisen, so daß auch:

eine vollständige Anweisung ist. Damit können auch Funktionen als Prozeduren verwendet werden.

Ein Objekt, dessen Typ bekannt ist, wird im Deklarationsteil durch

instanziiert und gegebenenfalls durch

initialisiert. Eine Referenz "->" (Referenz auf) auf einen Typnamen ist ein Objekt, welches als Wert eine Adresse hat, welche auf einen Speicherplatz vom jeweiligen Typ verweisen kann.

Durch das Schlüsselwort object wird ein Objekt (also eine Instanz) vom Typ Typname erzeugt, und deren Speicheradresse als Wert zurückgegeben. Eine optionale Parameterliste zu object gibt die Anfangswerte des erzeugten Objekts an. Der Typname vor object ist gleichfalls optional, wenn er eindeutig aus der Umgebung abgeleitet werden kann.

Beispiel

Durch die Deklaration

wird eine Adresse erzeugt, die über den Namen GanzRef referenziert werden kann. Ihr Wert ist eine Adresse auf ein Objekt vom Typ Ganzzahl, dessen Wert zwei ist.

7.3 Bedingte Anweisungen

Eine bedingte Anweisung führt eine Anweisungsfolge abhängig von einer Bedingung aus. Die bedingten Anweisungen in FirstStep sind:

Beide Konstrukte können Ergebnisse produzieren, die in jedem Fall Werte sind.

Analoges gilt für die case-Anweisung.

7.4 Wiederholte Anweisungen

Eine Wiederholung einer Anweisungsfolge wird durch eine Schleife ausgeführt. Die Schleife wird in der allgemeinsten Form eingeführt, wobei jedoch einzelne Komponenten entfallen dürfen.

Definition

Die allgemeine Schleife hat den folgenden Aufbau:

Als Lauf–, Abbruch- bzw. Übersprungkriterium gilt:

Bedingungen, die erst nach dem Durchlauf durch die Schleife geprüft werden, können im Schleifenkopf hinter dem Schlüsselwort "repeat" angegeben werden.

Durch yield for Bezeichner wert wird der Schleife ein wert zugewiesen. Wird im Schleifenkopf yield ausdruck geschrieben, so wird dieses als Rückgabewert bei Beendigung der Schleife verwendet (in diesem Fall darf es keinen Epilog geben). Es wird beim Abbruch jeweils der letzte Schleifenwert genommen, bzw. wenn bereits die erste Bedingung fehlschlägt der Initialwert.

Die Laufvariable hat den Typ des Ausdrucks in ":= ausdruck", falls es diesen gibt, sonst integer; sie kann natürlich nur gelesen werden. Wird ":= ausdruck" fortgelassen, so bedeutet dieses: ":= 1"; wird "by ausdruck" fortgelassen, so bedeutet dieses: "by 1"; wird "to ausdruck" fortgelassen, so läuft die Scheife unbegrenzt. Ist der erste Ausdruck ein Zeiger auf einen Datensatz, so muß hinter by ein Ausdruck stehen, der den nächster Zeiger ermittelt, beispielsweise: "by Lauf.Next".

Neben dieser Schleife gibt es noch eine weitere Möglichkeit, einen Wert zu berechnen, indem eine spezielle Schleife mit einer syntaktisch etwas einfacheren Form eingeführt wird. Sie dient insbesondere dazu, mehrfache Operationen durchzuführen:

Definition

Eine mehrfache Operation kann durch eine verallgemeinerte for-Schleife realisiert werden:

Hier gilt das gleiche wie bei der allgemeinen Schleife, nur daß im "Rumpf" nur ein ausdruck vorhanden sein darf, der entsprechend des operators iterativ mit dem anfangswert verknüpft wird. Die Schleife wird nicht abgeschlossen, da sie nur einen Ausdruck enthalten darf.

Beispiel

Die Summe der Zahlen von eins bis hundert ergibt sich zu:

Hier wird der Ausdruck: Lauf hundert Mal addiert. Der Anfangswert bist bei der Addition implizit 0. Das Produkt der ersten zehn Zahlen ergibt:

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

zurück Index vor