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
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
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
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
die Nebenwirkung, einen Punkt an der Position (0,0) zu zeichnen. Die Anweisung
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
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
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
eine Liste aller ungeraden Zahlen zwischen 1 und 30 zurück. Darüber hinaus verwenden Schleifen diese Laufvariable, und daher
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 trueoderfalse.
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
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
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
einen Punkt an der Position (0,0). Standardmäßig ist der Punkt grün und hat die Größe 3. Die Anweisung
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