Langage de programmation basé sur une carte postale

image
Source


Ralph Johnson, l'un des membres de Gang of Four, a montré une fois comment la syntaxe du langage Smalltalk-80 peut tenir sur une carte postale. Maintenant, près de 30 ans après la première version de Smalltalk, le dialecte Smalltalk à la croissance la plus rapide est Pharo, que nous examinerons plus tard.


Déclaration de méthode


exampleWithNumber: x 

Les méthodes sont déclarées comme : et sont membres de la classe. Une méthode avec plusieurs paramètres est déclarée comme ceci


 rangeFrom: start to: end 

Le nom de la méthode est rangeFrom:to: et les noms des paramètres sont start et end .


Déclaration de Pragma


 <syntaxOn: #postcard> 

Pragma est utilisé pour annoter la méthode. Cette annotation peut être utilisée par le compilateur ou d'autres méthodes comme métadonnées.


Commentaires


 "A ""complete"" Pharo syntax" 

Les commentaires sont indiqués par des guillemets. Les guillemets à l'intérieur du commentaire sont indiqués par des guillemets doubles.


Déclaration d'une variable locale


 | y | 

Les variables locales sont utilisées dans les calculs à l'intérieur de la méthode. Les déclarations de type variable ne sont pas requises car Smalltalk est un langage à typage dynamique.


Plusieurs variables sont déclarées dans une liste.


 | yx totalSum | 

Objets et messages


 true & false not & (nil isNil) 

Tout dans Smalltalk est un objet et les objets peuvent recevoir des messages. L'ordre d'exécution (c'est-à-dire l'envoi de messages) est de gauche à droite, mais les messages sans paramètres sont envoyés principalement conformément aux règles de priorité, donc l'ordre de calcul ici sera


 (true & (false not)) & (nil isNil) 

Il n'y a que quatre règles de priorité dans Smalltalk: les premiers messages sont envoyés entre parenthèses, puis unaires (sans paramètres supplémentaires en plus de l'objet destinataire lui-même, par exemple false not ), puis binaires (avec un paramètre supplémentaire, par exemple 1 + 2 ), puis messages avec plusieurs paramètres (par exemple 15 between: 1 and: 2 ). La priorité d'exécution est indiquée par un schéma simple.


crochets > unaire > binaire > messages avec plusieurs paramètres


Ces règles s'appliquent également aux opérations mathématiques, donc le résultat de l'expression


 1 + 15 / 4 " = (1 + 15) / 4 " 

sera 4 . Soit dit en passant, nil également un objet et peut recevoir et répondre aux messages.


Exécution conditionnelle et blocs de code


 true & false not & (nil isNil) ifFalse: [ self perform: #add: with: x ]. 

L'exécution conditionnelle est implémentée en envoyant des messages ifTrue , ifFalse à un objet ifFalse . L'argument de ce message est un bloc de code, indiqué par des crochets, qui est exécuté si la condition spécifiée est remplie.


Les blocs Smalltalk sont également utilisés comme fonctions anonymes:


 sum := [ :x :y | x+y ]. "  x,y -> x+y " sum value: 10 value: 25. "  ,  - 35" 

Vous envoyer des messages


 self perform: #add: with: x 

Le mot-clé self est utilisé comme référence à l'objet contenant la méthode lors de l'envoi de messages à l'objet lui-même. Ici, nous envoyons un message perform: with: avec les arguments #add et x . Le symbole # désigne une chaîne littérale, qui est utilisée ici comme identificateur de méthode.


Affectation variable


 y := thisContext stack size + super size. 

L'attribution d'une variable est indiquée par l'opérateur := . Le mot clé super est utilisé pour faire référence à un objet superclasse.


Tous les objets Smalltalk héritent de la classe Object ou de leur superclasse, qui, à son tour, hérite de sa superclasse ou de la classe Object .


Tableau statique


 byteArray := #[2 2r100 8r20 16rFF]. 

byteArray est une variable d'instance de classe déclarée lorsque la classe est déclarée. Le tableau byteArray est composé d'entiers écrits dans différents systèmes numériques sous la forme


 <>r<> 

La taille des tableaux statiques est fixe et définie au moment de la compilation. L'indexation des tableaux commence à 1


 byteArray at: 2 " = 2r100 " 

Dès le début, Smalltalk n'était pas seulement un langage, mais aussi un environnement de développement intégré avec sa propre machine virtuelle: les classes et méthodes Smalltalk ne sont pas stockées dans des fichiers texte séparés, mais sont immédiatement enregistrées dans une image de machine virtuelle et déclarées via l'interface de l'environnement de développement. Par exemple, le Counter classe Counter déclaré dans la section de classe comme


 Object subclass: #Counter instanceVariableNames: 'count initialValue' classVariableNames: '' package: 'MyCounter' 

et ses méthodes sont déclarées dans la section méthodes de la classe Counter .


Tableau dynamique


 { -42 . #($a #a #'I''m' 'a' 1.0 1.23e2 3.14s2 1) } 

Un tableau dynamique est créé lors de l'exécution.
Les tableaux peuvent contenir des données de différents types: le premier élément du tableau est le nombre -42, le deuxième élément du tableau est un tableau avec des éléments de différents types:


  • $a - le caractère "a"
  • #a #'I''m' - chaînes littérales "a" et "I'm"
  • 'a' - chaîne "a"
  • 1.0 1.23e2 - nombres à virgule flottante
  • 3.14s2 - fraction décimale avec une échelle de 2

Cycles


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

Les boucles dans Smalltalk sont implémentées en envoyant un message à un tableau avec un bloc qui sera exécuté sur chaque élément de ce tableau, ce qui est très similaire à l'approche fonctionnelle. À chaque itération, l'élément du tableau est passé en argument au bloc qui effectue certains calculs sur celui-ci. Dans le bloc de l'exemple, la variable locale var est déclarée, à laquelle est affecté le résultat de l'envoi du dernier message show à l'objet Transcript global.


Une caractéristique intéressante de Smalltalk est la possibilité de mettre en cascade des messages: expression


 Transcript show: 'A'; show: 'B'. 

affiche séquentiellement les lignes A et B dans la fenêtre de la console de Transcript . C'est équivalent au code


 Transcript show: 'A'. Transcript show: 'B'. 

mais évite la répétition du nom de l'objet récepteur de message de transcription. Le résultat de la cascade est la réponse de l'objet au dernier message.


Valeur de retour de la méthode


 ^ x < y 

Les retours sont indiqués par ^ . Dans ce cas, une valeur logique est renvoyée - le résultat de la comparaison x < y .

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


All Articles