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]]