
Quelle
Ralph Johnson, eines der Mitglieder von Gang of Four, hat einmal gezeigt, wie die Syntax der Smalltalk-80-Sprache auf eine Postkarte passt. Jetzt, fast 30 Jahre nach der ersten Version von Smalltalk, ist Pharo der am schnellsten wachsende Smalltalk-Dialekt, auf den wir später noch eingehen werden.
Methodenerklärung
exampleWithNumber: x
Methoden werden als :
deklariert und sind Mitglieder der Klasse. Eine Methode mit mehreren Parametern wird wie folgt deklariert
rangeFrom: start to: end
Der Methodenname lautet rangeFrom:to:
und die Parameternamen sind start
und end
.
Pragma-Erklärung
<syntaxOn: #postcard>
Pragma wird verwendet, um die Methode zu kommentieren. Diese Anmerkung kann vom Compiler oder anderen Methoden als Metadaten verwendet werden.
Kommentare
Kommentare werden durch Anführungszeichen angezeigt. Die Anführungszeichen im Kommentar werden durch doppelte Anführungszeichen angezeigt.
Deklarieren einer lokalen Variablen
| y |
Lokale Variablen werden in den Berechnungen innerhalb der Methode verwendet. Variablentypdeklarationen sind nicht erforderlich, da Smalltalk eine dynamisch typisierte Sprache ist.
In einer Liste werden mehrere Variablen deklariert.
| yx totalSum |
Objekte und Nachrichten
true & false not & (nil isNil)
Alles in Smalltalk ist ein Objekt, und Objekte können Nachrichten empfangen. Die Ausführungsreihenfolge (dh das Senden von Nachrichten) erfolgt von links nach rechts, aber Nachrichten ohne Parameter werden hauptsächlich gemäß den Prioritätsregeln gesendet, sodass die Berechnungsreihenfolge hier lautet
(true & (false not)) & (nil isNil)
In Smalltalk gibt es nur vier Prioritätsregeln: Zuerst werden Nachrichten in Klammern gesendet, dann unär (ohne zusätzliche Parameter neben dem Empfängerobjekt selbst, z. B. false not
), dann binär (mit einem zusätzlichen Parameter, z. B. 1 + 2
), dann Nachrichten mit mehrere Parameter (z. B. 15 between: 1 and: 2
). Die Priorität der Ausführung wird durch ein einfaches Schema angezeigt.
Klammern > unär > binär > Nachrichten mit mehreren Parametern
Diese Regeln gelten auch für mathematische Operationen, also das Ergebnis des Ausdrucks
1 + 15 / 4
wird 4
. nil
übrigens auch ein Objekt und kann Nachrichten empfangen und beantworten.
Bedingte Ausführung und Codeblöcke
true & false not & (nil isNil) ifFalse: [ self perform: #add: with: x ].
Die bedingte Ausführung wird implementiert, indem ifTrue
und ifFalse
Nachrichten an ein ifFalse
Objekt gesendet werden. Das Argument dieser Nachricht ist ein Codeblock in eckigen Klammern, der ausgeführt wird, wenn die angegebene Bedingung erfüllt ist.
Smalltalk-Blöcke werden auch als anonyme Funktionen verwendet:
sum := [ :x :y | x+y ]. sum value: 10 value: 25.
Senden von Nachrichten an sich selbst
self perform: #add: with: x
Das Schlüsselwort self
wird als Referenz auf das Objekt verwendet, das die Methode enthält, wenn Nachrichten an das Objekt selbst gesendet werden. Hier senden wir eine perform: with: Nachricht mit den Argumenten #add
und x
. Das Symbol #
bezeichnet eine Literalzeichenfolge, die hier als Methodenkennung verwendet wird.
Variablenzuordnung
y := thisContext stack size + super size.
Das Zuweisen einer Variablen wird vom Operator angegeben :=
. Das Schlüsselwort super wird verwendet, um auf ein Objekt der Oberklasse zu verweisen.
Alle Smalltalk-Objekte erben entweder von der Object
Klasse oder ihrer Oberklasse, die wiederum von ihrer Oberklasse oder von der Object
Klasse erbt.
Statisches Array
byteArray := #[2 2r100 8r20 16rFF].
byteArray
ist eine Klasseninstanzvariable, die beim Deklarieren der Klasse deklariert wird. Das byteArray-Array besteht aus Ganzzahlen, die in verschiedenen Zahlensystemen in der Form geschrieben sind
<>r<>
Die Größe der statischen Arrays ist festgelegt und wird zur Kompilierungszeit festgelegt. Die Array-Indizierung beginnt bei 1
byteArray at: 2
Smalltalk war von Anfang an nicht nur eine Sprache, sondern auch eine integrierte Entwicklungsumgebung mit einer eigenen virtuellen Maschine: Smalltalk-Klassen und -Methoden werden nicht in separaten Textdateien gespeichert, sondern sofort in einem Image einer virtuellen Maschine gespeichert und über die Oberfläche der Entwicklungsumgebung deklariert. Beispielsweise wird der Klassenzähler im Klassenabschnitt als deklariert
Object subclass: #Counter instanceVariableNames: 'count initialValue' classVariableNames: '' package: 'MyCounter'
und seine Methoden werden im Methodenabschnitt der Counter
Klasse deklariert.
Dynamisches Array
{ -42 . #($a #a #'I''m' 'a' 1.0 1.23e2 3.14s2 1) }
Zur Laufzeit wird ein dynamisches Array erstellt.
Arrays können Daten unterschiedlichen Typs enthalten: Das erste Element des Arrays ist die Nummer -42, das zweite Element des Arrays ist ein Array mit Elementen unterschiedlichen Typs:
$a
- das Zeichen "a"#a #'I''m'
Ich bin #a #'I''m'
- wörtliche Zeichenfolgen "a" und "I'm"'a'
- Zeichenfolge "a"1.0 1.23e2
- Gleitkommazahlen3.14s2
- Dezimalbruch mit einer Skala von 2
Zyklen
{ -42 . #($a #a #'I''m' 'a' 1.0 1.23e2 3.14s2 1) } do: [ :each | | var | var := Transcript show: each class name; show: each printString ].
Schleifen in Smalltalk werden implementiert, indem eine Nachricht an ein Array mit einem Block gesendet wird, der für jedes Element dieses Arrays ausgeführt wird, was dem funktionalen Ansatz sehr ähnlich ist. Bei jeder Iteration wird das Element des Arrays als Argument an den Block übergeben, der einige Berechnungen daran ausführt. Im Block im Beispiel wird die lokale Variable var deklariert, die das Ergebnis des Sendens der letzten Show-Nachricht an das globale Transcript
Objekt erhält.
Ein interessantes Merkmal von Smalltalk ist die Fähigkeit, Nachrichten zu kaskadieren: Ausdruck
Transcript show: 'A'; show: 'B'.
Zeigt nacheinander die Zeilen A
und B
im Transcript
Konsolenfenster an. Dies entspricht Code
Transcript show: 'A'. Transcript show: 'B'.
vermeidet jedoch die Wiederholung des Namens des Transcript-Nachrichtenempfängerobjekts. Das Ergebnis der Kaskadierung ist die Antwort des Objekts auf die letzte Nachricht.
Rückgabewert von der Methode
^ x < y
Rücksendungen sind mit ^
. In diesem Fall wird ein logischer Wert zurückgegeben - das Ergebnis des Vergleichs x < y
.