Allgemeine Konzepte - Cinderella Dokumentation
Description: The user's guide to the Interactive Geometry Software Cinderella

Zum Inhalt

# Allgemeine Konzepte

## Allgemeine Konzepte von CindyScript

Dieser Abschnitt ist eine kurze Einführung in die grundlegendsten Konzepte von CindyScript.

### CindyScript ist eine funktionale Sprache

Alle Berechnungen in CindyScript werden durch die Ausführung von Funktionen durchgeführt. Eine Funktion kann als eine Art Berechnung betrachtet werden, die die Argumente der Funktion nimmt und einen Ausgabewert produziert. Viele Berechnungen können bereits nur mit elementaren Funktionen ausgedrückt werden. So berechnet das Code-Fragment

    sum(1..10)

die Summe der ersten 10 ganzen Zahlen. Hier ist `..` eine Funktion, die zwei ganze Zahlen, `a` und `b`, nimmt und als Ausgabe die Liste aller ganzen Zahlen von `a` bis `b` erzeugt. Also `1..10` erzeugt eine Liste von 10 ganzen Zahlen: `[1,2,3,4,5,6,7,8,9,10]`. Die Funktion sum(_) ist unär (d.h. nimmt ein einzelnes Argument). Sie nimmt als Argument eine Liste von Zahlen als Eingabe und erzeugt als Ausgabe eine Zahl, die der Summe der Listeneinträge entspricht. Also wenn wir `sum(1..10)` in die Befehlsshell eingeben, antwortet das System mit dem Ergebnis `55`.

Darüber hinaus werden scheinbar prozedurale Anweisungen, wie eine `if`-Anweisung, als Funktionen realisiert. Zum Beispiel demonstriert der Ausdruck

    if(x<y,print("Mine"),print("Yours"))

die Funktion `if`, die drei Argumente nimmt. Sie prüft die Bedingung ihres ersten Arguments `x<y` und wertet abhängig vom Ergebnis das zweite oder das dritte Argument aus, d.h. entweder `print("Mine")` oder `print("Yours"))`. Das Ergebnis dieser Auswertung ist das Ergebnis der `if(_,_,_)`-Funktion. Also ist der obige Ausdruck äquivalent zu

    print(if(x<y,"Mine","Yours"))

Je nach Auswertung der Bedingung gibt die `if`-Funktion den Wert des zweiten oder dritten Arguments zurück.

### Nebenwirkungen

Wenn eine Funktion in CindyScript ausgewertet wird, kann sie „Nebenwirkungen" haben. Nebenwirkungen sind wichtig für alle Arten von Wechselwirkungen zwischen einem CindyScript-Programm und einer Cinderella-Konstruktion. Typische Nebenwirkungen sind:

- Zeichnen: Eine CindyScript-Anweisung kann Zeichnungsoperationen in den Konstruktionsansichten verursachen.
- Zuweisungen: Eine CindyScript-Operation kann die Position, Farbe, Größe usw. geometrischer Objekte ändern.
- Variablenzuweisungen: Eine CindyScript-Anweisung kann Variablen erstellen und ihnen Werte zuweisen.
- Funktionserstellung: Eine CindyScript-Anweisung kann eine Funktion erstellen und definieren, die später verwendet werden kann.

Zum Beispiel erzeugt die Anweisung

    draw([0,0])

die Nebenwirkung, einen Punkt an der Position `(0,0)` zu zeichnen. Die Anweisung

    A.color=[1,1,1]

setzt die Farbe des Punktes A auf Weiß.

### Kontrollfluss

Die meisten Benutzer sind wahrscheinlich an sequenzielle Programmiersprachen wie C, Java, Pascal und Basic gewöhnt. In der Praxis unterscheidet sich das Schreiben von sequenziellem Code in CindyScript nicht viel vom Schreiben von Code in diesen Sprachen. CindyScript hat einen `;`-Operator `<statement1>;<statement2>`, der einfach zuerst `statement1` und dann `statement2` auswertet. Der Rückgabewert des `;`-Operators ist das Ergebnis der letzten Anweisung. Das Schreiben eines sequenziellen Programms ist relativ einfach und sieht ähnlich wie ein in einer sequenziellen Sprache geschriebenes Programm aus. Zum Beispiel erstellt das Programm

    repeat(9,i,
       j=i*i;
       draw([i,j]);
    )

neun Punkte auf einer Parabel. Die Funktion `repeat(<number>, <variable>, <program>)` erstellt eine Schleife, die `<number>`-Mal ausgeführt wird. In jedem Durchlauf wird die Variable `<variable>` erhöht (beginnend mit `1`). Der Rumpf der Schleife sind die zwei Zeilen `j=i*i; draw([i,j]);`.

### Keine explizite Typifizierung

CindyScript ist darauf ausgelegt, maximale Funktionalität mit minimalem syntaktischem Aufwand zu bieten. Daher hat CindyScript keine explizite Typifizierung von Werten. Wie viele andere Sprachen verwendet CindyScript das Konzept der Variablen. Im Gegensatz zu anderen Sprachen gehören die Variablen jedoch nicht zu einem bestimmten Typ. Jeder Wert von jedem Typ kann jeder Variablen zugewiesen werden. Einerseits gibt dies dem Programmierer viel Freiheit, um leistungsstarken Code zu schreiben. Zum Beispiel definiert das folgende Code-Fragment

    f(x,y):=x+y;

eine Funktion `f(x,y)`, die zum Addieren von ganzen Zahlen oder komplexen Zahlen sowie Vektoren oder Matrizen verwendet werden könnte. Andererseits erfordert diese Freiheit, dass der Programmierer beim Schreiben eines Programms gewisse Verantwortung übernimmt, um semantisch aussagekräftigen Code zu produzieren. Wenn eine Funktion versucht, einen sinnlosen Ausdruck auszuwerten, wird das Programm nicht automatisch beendet. Stattdessen gibt die Funktion den Wert `___` zurück, der für einen sinnlosen Ausdruck steht. Im obigen Beispiel führt `f([1,2],[3,4])` also eine Vektoraddition durch und wird zu `[4,5]` ausgewertet, während der Ausdruck `f(4,[3,4])` sinnlos ist und zu `___` ausgewertet wird.

### Lokale Variablen: Die # Variable

Es gibt mehrere Schleifen-ähnliche Konstruktionen in CindyScript. Zum Beispiel durchläuft der Operator `select(<list>,<condition>)` alle Elemente von `<list>` und gibt eine Liste von Objekten zurück, die die Bedingung erfüllen. Dafür muss es eine Möglichkeit geben, Elemente, die getestet werden sollen, der Bedingung zuzuführen. Standardmäßig verwendet CindyScript eine Variable #, die als Handle für die Laufvariable dient. Zum Beispiel gibt die Anweisung

    select(1..30,isodd(#))

eine Liste aller ungeraden Zahlen zwischen `1` und `30` zurück. Darüber hinaus verwenden Schleifen diese Laufvariable, und daher

    repeat(9,print(#))

gibt alle Zahlen von `1` bis `9` aus. Es ist auch möglich, eine explizite Laufvariable zu verwenden, indem man sie als zweites Argument bereitstellt. Also sind `select(1..30,i,isodd(i))` und `repeat(9,i,print(i))` äquivalent zu den obigen Anweisungen.

### Die Datentypen von CindyScript

Wie bereits erwähnt, hat CindyScript keine explizite Typifizierung. Dennoch gehört jeder Wert einer Variablen zu einem expliziten Typ. Die grundlegenden Typen von CindyScript sind

- : Jeder numerische Wert. Zahlen können ganze Zahlen, reelle Zahlen oder komplexe Zahlen sein.
- : Eine Liste beliebiger Objekte. Eine solche Liste kann semantisch auch die Bedeutung eines Vektors oder einer Matrix haben.
- : Ein Textausdruck.
- : Ein geometrisches Objekt, das zu einer Konstruktion gehört.
- : Ein Wert `true` oder `false`.

Der Zahlentyp ist besonders leistungsstark, da er ganze Zahlen, Gleitkommazahlen und komplexe Zahlen enthalten kann.

### Variablen und ihr Gültigkeitsbereich

Da CindyScript keine explizite Typifizierung für Variablen hat, ermöglicht es Variablen, „spontan" nach Bedarf erstellt zu werden. Eine Variable wird erstellt, wenn ihr zum ersten Mal ein Wert zugewiesen wird. Wenn `x` noch nicht verwendet wird, erstellt die Anweisung

    x=7

die Variable `x` und weist ihr den Wert `7` zu. Nach der Zuweisung einer Variablen ist ihr Wert für den Rest der Ausführung zugänglich. Werte können auch durch lokale Variablen einer Funktion teilweise überlagert werden. Also in einer durch

    f(x,y):=x+y

definierten Funktion sind die Werte von `x` und `y` die lokalen Parameter der Funktion. Nach Abschluss der Funktionsausführung wird der ursprüngliche Wert von `x` wiederhergestellt. Man kann auch zusätzliche lokale Variablen mit dem Operator `regional(...)` erzeugen.

### Zugriff auf geometrische Elemente und ihre Eigenschaften

Variablen werden auch als eine Art Handle zu geometrischen Objekten verwendet. Sie bilden eine wichtige Verbindung von CindyScript zu Cinderella und CindyLab. Wenn eine Variable einen Namen hat, der identisch mit dem Label eines geometrischen Objekts ist, bietet sie eine Verbindung zu diesem geometrischen Objekt. Der Wert der Variablen kann immer noch durch eine explizite Zuweisung eines Wertes zur Variablen überlagert werden. Die verschiedenen Eigenschaften eines geometrischen Objekts (Position, Farbe, Größe usw.) sind über den Operator `.` zugänglich. Also wenn `A` ein Punkt in einer geometrischen Konstruktion ist, gibt der Ausdruck `A.size` eine ganze Zahl zurück, die die Größe des Punktes darstellt. Der Ausdruck `A.xy=[3,4]` weist den Punkt der Koordinate `[3,4]` zu. Darüber hinaus sind Eigenschaften, die für die Physik-Simulation relevant sind (Masse, Geschwindigkeit, kinetische Energie usw.), über den Operator `.` zugänglich.

### Modifizierer

Viele Operatoren in CindyScript bieten mehr Funktionalität, als man auf den ersten Blick bemerken könnte. Normalerweise können auf diese Funktionen mit sogenannten Modifizierern zugegriffen werden. Die Operatoren sind so definiert, dass ihre Standardnutzung in den meisten Situationen ein passendes Verhalten bietet. Es kann jedoch notwendig sein, das Standardverhalten zu ändern. Zu diesem Zweck listet man entsprechende Modifizierer im Aufruf des Operators auf. Zum Beispiel zeichnet die Anweisung

    draw([0,0])

einen Punkt an der Position `(0,0)`. Standardmäßig ist der Punkt grün und hat die Größe 3. Die Anweisung

    draw([0,0],size->15,color->[1,1,0])

zeichnet einen gelben Punkt der Größe 15. Modifizierer müssen durch Kommas getrennt werden. Sie können an jeder Stelle des Funktionsaufrufs in beliebiger Reihenfolge auftreten.

### Listen/Vektoren/Matrizen

CindyScript bietet Listen als elementare Datentypen. Listen sind das grundlegende Paradigma, das zur Definition komplexerer Datenstrukturen verwendet wird. Zusätzlich zur offensichtlichen Anwendung als Aufzählungsobjekte können Listen auch zur Darstellung von Vektoren und Matrizen verwendet werden. Ein Vektor ist eine Liste von Zahlen. Eine Liste von Vektoren, deren Vektoren alle die gleiche Länge haben, wird als Matrix interpretiert. CindyScript bietet die üblichen Operationen zum Kombinieren von Vektoren, Matrizen und Zahlen. Je nach Inhalt von `a` und `b` kann der Ausdruck `a*b` eine gewöhnliche Multiplikation von Zahlen, ein Matrixprodukt oder eine Matrix/Vektor-Multiplikation darstellen.

In CindyScript gibt es auf der Ebene von Vektoren keine Unterscheidung zwischen Zeilenvektoren und Spaltenvektoren. Durch die Verwendung geeigneter Funktionen kann man jedoch einen Vektor der Länge `n` in eine (n × 1) Matrix oder in eine (1 × n) Matrix umwandeln.

### Zeichnen

CindyScript bietet viele Anweisungen, mit denen man direkt auf der Canvas der geometrischen Ansichten zeichnen kann. Mit dieser Funktion ist es möglich, das Verhalten von Cinderella-Konstruktionen erheblich zu bereichern. Es ist möglich, Punkte, Linien, Segmente, Polygone, Tabellen, Funktionen usw. zu zeichnen. Es ist jedoch wichtig, ein skriptgezeichnetes geometrisches Objekt nicht mit einem geometrischen Objekt zu verwechseln, das in der Geometrie aktiv ist. Es ist nicht möglich, solche skriptgezeichneten Elemente als Definoren in Cinderella-Modi zu verwenden.

Wenn man aktive Elemente mit einem Skript ändern möchte, muss man sie zunächst konstruieren und dann ihre Positionen mit CindyScript-Anweisungen ändern. Alle freien Elemente können durch Setzen ihrer Positionsparameter verschoben werden.

### Ausführungsslots

Das Skriptfenster von Cinderella, in das man den CindyScript-Code eingibt, enthält mehrere Slots, in die der Text eingegeben werden kann. Die einzelnen Slots heißen

- Draw
- Move
- Initialization
- Timer Tick
- Simulation Start
- Simulation Stop
- …

Jeder dieser Einträge entspricht dem Anlass, der die Ausführung des Skripts auslöst. Zum Beispiel werden Skripte im Slot Draw direkt vor einer Bildschirmaktualisierung in der Ansicht ausgeführt. Der Slot Initialization wird direkt nach dem Parsen des CindyScript-Codes ausgeführt. Simulation Start wird vor dem Starten einer Animation ausgeführt, wenn die Wiedergabeschaltfläche gedrückt wird. Mit diesem Mechanismus ist es möglich, Programme zu schreiben, die angenehm auf Benutzerereignisse reagieren.

### Fehlerbehandlung zur Laufzeit

CindyScript läuft in einer Laufzeitumgebung. Im Prinzip kann jede kleine Bewegung in einer Konstruktion die Auswertung eines Skripts verursachen. Damit dies geschieht, musste eine vernünftige Designentscheidung in der Sprache bezüglich des Auftretens von Laufzeitfehlern getroffen werden. Es wäre sehr ablenkend, wenn die normale Benutzerinteraktion immer wieder durch Fehlermeldungen unterbrochen würde (besonders, wenn eine Konstruktion als Applet in einer HTML-Seite verwendet wird). Aus diesem Grund werden Laufzeitfehler in CindyScript nur die ersten zehn Fehler gemeldet. Allerdings unterbrechen Laufzeitfehler die Ausführung niemals. Laufzeitfehler (wie Division durch Null oder Zugriff auf einen nicht vorhandenen Array-Index) werden im Programmfluss einfach ignoriert. Fehlerhafte Funktionsauswertungen erzeugen einfach ein undefiniertes Ergebnis, und die Berechnung geht weiter (möglicherweise verursacht mehr undefinierte Ergebnisse). Dies garantiert normalerweise ein flüssiges Ausführen einer Konstruktion, auch wenn Fehler auftreten.

Diese Funktion kann das Debugging von Programmen etwas mühsam gestalten, da Laufzeitfehler nicht gemeldet werden. Zu diesem Zweck wurde eine spezielle Funktion, `assert(<boolean>,<string>)`, eingeführt, um zu überprüfen, ob eine bestimmte Annahme über die aktuellen Daten erfüllt ist. Wenn die Annahme im ersten Argument nicht erfüllt ist, wird die Meldung im zweiten Argument gedruckt.

Diese Seite wurde automatisch mit KI (Claude) übersetzt und wartet noch auf Überprüfung. → Alle KI-übersetzten Seiten