Studie "Objektorientiert Programmierung in Logo"
AN "A
Streckenzüge werden als Punktlisten eingegeben und können durch Programme wie VERSCHOBEN, GESPIEGELT und GEDREHT abgebildet werden. Zahlen werden als Ziffernfolgen eingegeben und addiert, subtrahiert, multipliziert oder dividiert. Der Unterschied zwischen Streckenzügen und Zahlen ist also gar nicht so groß. Beides sind Objekte, die, wenn sie einmal definiert sind, durch Operationen verändert werden können.
Auch der Igel ist ein Objekt, das durch bestimmte Eigenschaften definiert ist und durch bestimmte Operationen verändert werden kann.
Aufgabe: Welche Informationen muß der Computer über den Igel speichern? Welche Igel-Befehle beziehen sich auf welche Eigenschaften?
Eine Figur ist zunächst durch ihre Gestalt beschrieben.
make "quadrat [# [0 0] [0 100] [100 100] [100 0] [0 0]]
Das Programm ZEICHNE bringt diese Figur auf den Bildschirm:
to zeichne :l
if :l=[] [stop]
test (first :l) = "#
iftrue [penup zeichne butfirst :l]
iffalse [setpos first :l pendown zeichne butfirst :l]
end
Weil das Programm offene Streckenzüge zeichnet, wurde in beiden Punktlisten der erste Punkt der Liste an ihrem Ende noch einmal genannt. Durch einen Doppelkreuz angekündigte Punkte werden mit gehobenem Stift angesteuert.
to zeichne :quadrat
Weitere Merkmale der Figur sind Größe, Position und Ausrichtung. In der folgenden Abbildung ist das Sofa in doppelter Größe um 30° gedreht dargestellt und um 60 Einheiten nach rechts und 20 Einheiten nach unten verschoben. Dazu wurden die bereits bekannten Funktionen gestreckt, gedreht und verschoben verwendet-
zeichne :quadrat zeichne verschoben [60 -20] gedreht 30 gestreckt 2 :quadrat
Diese Figur ist durch die vier Eigenschaften Form, Größe, Ausrichtung und Position festgelegt. Um diese Figur in Logo zu beschreiben, verwenden wir wieder eine Liste. Wir schreiben:
make "figur [quadrat 2 30 [60 -20]]
Kreise werden wir durch regelmäßige 18-Ecke annähern. Als Grundfigur für alle 'Kreise' führen wir die folgende Punktliste ein:
make "kreis [# [0 50] [3 67.1] [11.7 82.1] [25 93.3] [41.3 99.2] [58.7 99.2] [75 93.3] [88.3 82.1] [97 67.1] [100 50] [97 34.9] [88.3 17.9] [75 6.7] [58.7 0.8] [41.3 0.8] [25 6.7] [11.7 17.9] [3 32.9] [0 50]]
Wir wollen nun solche Figuren als selbständige Objekte betrachten und sie 'zum Leben' erwecken. Dazu schreiben wir Programme, die es uns ermöglichen, mit ihnen wie mit dem Igel zu 'reden', etwa in der folgenden Art:
erzeuge "quadrat "stuhl
erzeuge "kreis "tisch
an "tisch
auf [40 20]
wachse 5
erscheine
an "stuhl
wachse 2
gehe [60 -20]
drehe 30
erscheine
Wir betrachten diese Befehle genauer:
Das Programm erzeuge erhält als Eingaben zwei Wörter: den Namen einer neuen Figur, die es erzeugen soll, und den Namen eines Figurtyps (z.B. "SOFA oder "KREIS). Eine Figur soll in der Grundstellung die Größe 1 haben und bei (0;0) liegen. Als Drehwinkel wird am Anfang 0° eingetragen:
to erzeuge :typname :figurname
make :figurname (list :typname 1 0 [0 0])
end
:figurname ist Platzhalter für einen Variablennamen. Deshalb lautet hier die Zuweisung make :figurname ... und nicht make "figurname ...
Das Programm AN teilt dem Computer den Namen der Figur mit, die fortan angesprochen werden soll. Dieser Name wird in einer speziellen (globalen) Variable festgehalten.
to an :figurname
make "f :figurname
end
Die Programme WACHSE, DREHE und AUF verändern in der Liste der Eigenschaften der aktuellen Figur den Eintrag für die Größe bzw. die Position bzw. die Blickrichtung. Als Hilfsprogramm wird setzeelement eingeführt.
to wachse :faktor
make :f setzeelement 2 thing :f :faktor
end
to drehe :winkel
make :f setzeelement 3 thing :f :winkel
end
to auf :ort
make :f setzeelement 4 thing :f :ort
end
to setzeelement :n :l :wert
if :l = [] [output []]
if :n = 1 [output fput :wert butfirst :l]
output fput (first :l) (setzeelement :n-1 butfirst :l :wert)
end
In den Programmen ist :f der Name einer Figur, also zum Beispiel "stuhl. Um die Eigenschaften dieser stuhl-Figur zu erfahren, müssen wir :stuhl oder thing :f abrufen. Wir geben die Programmteile ein und testen sie:
erzeuge "quadrat "stuhl
an "stuhl
wachse 2
drehe 30
auf [60 -20]
liefert die Liste [quadrat 2 30 [60 -20]], was wir sofort überprüfen:
:f
You don't say what to do with stuhl
:stuhl
You don't say what to do with [quadrat 2 30 [60 -20]]
thing :f
You don't say what to do with [quadrat 2 30 [60 -20]]
Für die Darstellung der aktuellen Figur ist das Programm ERSCHEINE zuständig. Erst in diesem Programm werden die Koordinaten aller Eckpunkte der aktuellen Figur berechnet und durch einen Streckenzug verbunden.
Um z.B. die Figur [QUADRAT 2 30 [60 -20]] darzustellen, wird in ERSCHEINE zunächst der Streckenzug :QUADRAT mit Hilfe des Programms GESTRECKT auf das Zweifache vergrößert, durch GEDREHT um 30° nach rechts gedreht und dann mit Hilfe des Programms VERSCHOBEN um 20 LE nach rechts und 20 LE nach oben verschoben. Die so erzeugte Punktliste wird dem Programm ZEICHNE übergeben, das den Streckenzug zeichnet.
In diesem Fall liefert der Befehl
zeichne verschoben [60 -20] gedreht 30 gestreckt 2 :quadrat
das gewünschte Ergebnis.
Um dieses Vorgehen auf die Figur :stuhl anzuwenden, müssen wir die Elemente der Eigenschaftenliste [quadrat 2 30 [60 -20]] abfragen:
(item 4 :stuhl) ergibt [60 -20]
(item 3 :stuhl) ergibt 30
(item 2 :stuhl) ergibt 2
(item 1 :stuhl) ergibt "quadrat
An die Liste der zur Quadrat-Figur gehörigen Punkte gelangen wir durch thing:
thing (item 1 :stuhl) ergibt [# [0 0] [0 100] [100 100] [100 0] [0 0]]
Im folgenden Programm werden diese Schritte zusammengefaßt:
to erscheine
make "f# thing :f
zeichne verschoben (item 4 :f#) gedreht (item 3 :f#) …
... gestreckt (item 2 :f#) (thing item 1 :f#)
end
Aufgabe: Schreibe die Programme SEI, AN, WACHSE, DREHE, GEHE und ERSCHEINE (sowie die bekannten VERSCHOBEN, GESTRECKT, GEDREHT und ZEICHNE). Schaffe die Figuren "TISCH, "STUHL und bringe sie in Position und lasse sie 'erscheinen'.
Aufgabe: Noch unterhaltsamer wird es, wenn wir mit den Figuren etwas normaler reden können. Dazu erfinden wir einige Programme, die gar nichts tun oder eine an sie übergebene Liste ohne Veränderung wieder ausgeben. Wenn sie geeignete Namen haben, sind sie dennoch nützlich. Wir können auch Programme oder Variablen über neue Programme mit zusätzlichen Namen versehen. Schreibe folgende Programme und weitere:
to gehe
end
to ein
end
to dich :l
output :l
end
to punkt :l
output :l
end
to neues :x :y
erzeuge :x :y
end
to neuer :x :y
erzeuge :x :y
end
to quadrat
output "quadrat
end
to kreis
output "kreis
end
Probiere dann folgende Unterhaltung:
neues quadrat "stuhl
ein neuer kreis "tisch
an "tisch
gehe auf [40 20] und wachse 5
erscheine
an "stuhl
wachse 2
gehe auf punkt [60 -20]
drehe dich um 30 grad
erscheine
Aufgabe: Beschreibe einen Sessel und ein Sofa.
Make "sofa [# [0 0] [0 100] [100 100] [100 0] [0 0] # [25 100] [25 25] [75 25] [75 100]]