[Squeak-ev] Re: Dispatch Procedure

Jens Mönig jens at moenig.org
Mit Nov 16 16:47:07 UTC 2011


Hallo Rüdeger,

OOP nach SICP-Art (Abelson & Sussman) kann man natürlich nicht nur in Scheme
selber bauen, sondern auch in Smalltalk, denn auch Smalltalk hat first class
Funktionen, nämlich Blöcke, und zumindest in den meisten Dialekten
inzwischen auch echte Closures, also temporäre Variables, welche die
Ausführung ihrer Funktion "überleben" können. 

Mit diesem Effekt kann man objektorientierte Systeme nach dem Prinzip
"Objekte sind auch nur Closures" selbst erfinden.

Um das Schulbeispiel eines einfachen Zählers in Smalltalk nachzuvollziehen,
kannst Du z.B. in einer Smalltalk Workspace sinngemäß folgendes ausprobieren
(und dabei der Einfachheit halber die Variablen "CounterClass", "Counter1"
und "Counter2" global deklarieren):

    CounterClass := [ | count |
        count := 0. 
        ^[count := count + 1. 
            ^count]].

Damit hast Du der Variable namens "CounterClass" einen Dispatch-Block
zugewiesen. Führt man diesen Block aus, erhält man als Ergebnis einen
anderen Block, den man wiederum anderen Variablen zuweisen kann:

    Counter1 := CounterClass value.
    Counter2 := CounterClass value.

Auch diese Blöcke kann man jetzt jeweils einzeln ausführen:

    Counter1 value.

ergibt als Ergebnis "1".

Jedesmal wenn Du diesen Ausdrück erneut ausführst, erhältst Du ein um 1
inkrementiertes Ergebnis. Gleiches gilt für weitere Counter-Instanzen:

    3 timesRepeat: [Counter2 value].

Das Besondere daran ist, dass sich jede Counter-Instanz ihren eigenen
Zählerstand merkt, ganz wie ein echtes Objekt eben. Das liegt daran, dass
die temporäre Blockvariable "count" in einer äußeren Scope, nämlich im
Dispatch-Block angelegt ist. Die inneren Blöcke (Counter1 und Counter2)
verweisen auf diese eigentlich temporäre Variable, und machen sie somit
persistent, sogar nachdem der ursprüngliche "CounterClass" Block längst
ausgeführt worden ist.

Nun kann man natürlich den Dispatch-Block noch wesentlich komplexer
gestalten, und insbesondere den "Objekt-Blöcken" noch Block-Argumente mit
Fallunterscheidungen zuweisen. Auf diese Art kann man dann z.B. verschiedene
Nachrichten und auch Parameter an solche Closure-Objekte implementieren, und
sogar Vererbung selber bauen.

Viele Grüße
-Jens

--
View this message in context: http://forum.world.st/Squeak-Etoys-Homepage-aus-dem-Dornroschenschlaf-wecken-tp3991829p4076998.html
Sent from the Deutsch (German) mailing list archive at Nabble.com.