Lenguaje de programación basado en postales

imagen
Fuente


Ralph Johnson, uno de los miembros de Gang of Four, una vez mostró cómo la sintaxis del lenguaje Smalltalk-80 puede caber en una postal. Ahora, casi 30 años después de la primera versión de Smalltalk, el dialecto Smalltalk de más rápido crecimiento es Pharo, que veremos más adelante.


Declaración del método


exampleWithNumber: x 

Los métodos se declaran como : y son miembros de la clase. Un método con múltiples parámetros se declara así


 rangeFrom: start to: end 

El nombre del método es rangeFrom:to: y los nombres de los parámetros son start y end .


Declaración de pragma


 <syntaxOn: #postcard> 

Pragma se usa para anotar el método. Esta anotación puede ser utilizada por el compilador u otros métodos como metadatos.


Comentarios


 "A ""complete"" Pharo syntax" 

Los comentarios se indican entre comillas. Las comillas dentro del comentario se indican entre comillas dobles.


Declarando una variable local


 | y | 

Las variables locales se utilizan en los cálculos dentro del método. No se requieren declaraciones de tipo variable ya que Smalltalk es un lenguaje de tipo dinámico.


Se declaran varias variables en una lista.


 | yx totalSum | 

Objetos y mensajes


 true & false not & (nil isNil) 

Todo en Smalltalk es un objeto, y los objetos pueden recibir mensajes. El orden de ejecución (es decir, el envío de mensajes) es de izquierda a derecha, pero los mensajes sin parámetros se envían principalmente de acuerdo con las reglas de prioridad, por lo que el orden de cálculo aquí será


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

Solo hay cuatro reglas de prioridad en Smalltalk: los primeros mensajes se envían entre paréntesis, luego son unarios (sin parámetros adicionales además del objeto receptor, por ejemplo, false not ), luego binarios (con un parámetro adicional, por ejemplo 1 + 2 ), luego mensajes con varios parámetros (por ejemplo, 15 between: 1 and: 2 ). La prioridad de ejecución se indica mediante un esquema simple.


paréntesis > unario > binario > mensajes con múltiples parámetros


Estas reglas también se aplican a las operaciones matemáticas, por lo que el resultado de la expresión


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

será 4 . Por cierto, nil también nil un objeto y puede recibir y responder mensajes.


Ejecución condicional y bloques de código


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

La ejecución condicional se implementa enviando mensajes ifTrue , ifFalse a un objeto ifFalse . El argumento de este mensaje es un bloque de código, indicado entre corchetes, que se ejecuta si se cumple la condición especificada.


Los bloques Smalltalk también se usan como funciones anónimas:


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

Enviar mensajes a ti mismo


 self perform: #add: with: x 

La palabra clave self se usa como referencia al objeto que contiene el método al enviar mensajes al objeto mismo. Aquí enviamos un rendimiento: con: mensaje con argumentos #add y x . El símbolo # denota una cadena literal, que se usa aquí como un identificador de método.


Asignación variable


 y := thisContext stack size + super size. 

La asignación de una variable está indicada por el operador := . La palabra clave super se usa para referirse a un objeto de superclase.


Todos los objetos Smalltalk heredan de la clase Object o de su superclase, que, a su vez, hereda de su superclase o de la clase Object .


Matriz estática


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

byteArray es una variable de instancia de clase declarada cuando se declara la clase. La matriz byteArray consta de enteros escritos en diferentes sistemas de números en la forma


 <>r<> 

El tamaño de las matrices estáticas es fijo y se establece en tiempo de compilación. La indexación de matriz comienza en 1


 byteArray at: 2 " = 2r100 " 

Desde el principio, Smalltalk no solo era un lenguaje, sino también un entorno de desarrollo integrado con su propia máquina virtual: las clases y métodos de Smalltalk no se almacenan en archivos de texto separados, sino que se guardan inmediatamente en una imagen de máquina virtual y se declaran a través de la interfaz del entorno de desarrollo. Por ejemplo, el Counter clase Counter declara en la sección de clase como


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

y sus métodos se declaran en la sección de métodos de la clase Counter .


Matriz dinámica


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

Se crea una matriz dinámica en tiempo de ejecución.
Las matrices pueden contener datos de diferentes tipos: el primer elemento de la matriz es el número -42, el segundo elemento de la matriz es una matriz con elementos de diferentes tipos:


  • $a - el caracter "a"
  • #a #'I''m' - cadenas literales "a" y "I'm"
  • 'a' - cadena "a"
  • 1.0 1.23e2 - números de coma flotante
  • 3.14s2 - fracción decimal con una escala de 2

Ciclos


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

Los bucles en Smalltalk se implementan enviando un mensaje a una matriz con un bloque que se ejecutará en cada elemento de esta matriz, que es muy similar al enfoque funcional. En cada iteración, el elemento de la matriz se pasa como un argumento al bloque que realiza algunos cálculos en él. En el bloque del ejemplo, se declara la variable local var, a la que se le asigna el resultado de enviar el último mensaje show al objeto Transcript global.


Una característica interesante de Smalltalk es la capacidad de enviar mensajes en cascada: expresión


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

muestra secuencialmente las líneas A y B en la ventana de la consola Transcript . Esto es equivalente al código


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

pero evita la repetición del nombre del objeto receptor del mensaje Transcript. El resultado de la cascada es la respuesta del objeto al último mensaje.


Valor de retorno del método


 ^ x < y 

Las devoluciones se indican con ^ . En este caso, se devuelve un valor lógico: el resultado de la comparación x < y .

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


All Articles