Postkartenbasierte Programmiersprache

Bild
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


 "A ""complete"" Pharo syntax" 

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 " = (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 ]. "  x,y -> x+y " sum value: 10 value: 25. "  ,  - 35" 

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 " = 2r100 " 

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 - Gleitkommazahlen
  • 3.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 .

Source: https://habr.com/ru/post/de446578/


All Articles