Apéndice B Resumen de sintaxis

SintaxisQué representa
startPointun nombre de variable
Transcriptun nombre de variable global
selfpseudo-variable
1entero (decimal)
2r101entero (base 2)
16r1aentero (base 16)
1.5número de coma flotante
2.4e7notación exponencial
$ael carácter ‘a’
'Hello'La cadena “Hello”
#Helloel símbolo #Hello
#(1 2 3)un array literal
{1. 2. 1 + 2}un array dinámico
"a comment"un comentario
| x y |declaración de variables x e y
x ← 1, x := 1asignar 1 a x
[x + y]un bloque que se evalúa como x+y
<primitive: 1>primitiva de la máquina virtual o anotación
3 factorialun mensaje unitario
3 + 4un mensaje binario
2 raisedTo: 6 modulo: 10un amensaje de palabra clave
↑ true, ^ truedevuelve el valor true
Transcript show: 'hello'. Transcript crseparador de expresión (.)
Transcript show: 'hello'; crmensaje en cascada (;)
ColoredBoxMorph new :: color: Color blue; openInWorldmensaje en cadena (::)
`{ 3@4 . 56 . 'click me'}`la composición del literal #(3@4 56 'click me')
Variables locales.

startPoint es un nombre de variable o identificador. Por convención, los identificadores se componen de palabras en «camelCase» (es decir, cada palabra, excepto la primera, comienza con una letra mayúscula). La primera letra de una variable de instancia, método o argumento de bloque, o variable temporal debe ser minúscula. Esto indica al lector que la variable tiene un ámbito privado.

Shared variables

Los identificadores que comienzan con letras mayúsculas son variables globales, variables de clase, diccionarios de grupo o nombres de clase. Smalltalk es una variable global, una instancia de la clase SystemDictionary.

El receptor.

self es una palabra clave que hace referencia al objeto dentro del cual se está ejecutando el método actual. Lo llamamos «the receiver» (el receptor) porque este objeto normalmente habrá recibido el mensaje que provocó la ejecución del método. self se denomina «pseudovariable» ya que no podemos asignarle ningún valor.

Enteros.

Además de los números enteros decimales comunes como 42, Cuis-Smalltalk también ofrece una notación de base. 2r101 es 101 en base 2 (es decir, binario), que es igual a 5 en decimal.

Números de coma flotante.

Los números de coma flotante se pueden especificar con su exponente en base diez: 2.4e7 es 2.4 × 107.

Caracteres.

El signo del dólar introduce un carácter literal: $a es el literal para ‘a’. Las instancias de caracteres no imprimibles se pueden obtener enviando mensajes con los nombres adecuados a la clase Character, como son Character space y Character tab.

Cadenas.

Las comillas simples se utilizan para definir una cadena literal. Si desea una cadena con una comilla dentro, simplemente duplique la comilla, como en 'G''day'.

Símbolos.

Los símbolos son como cadenas, en el sentido de que contienen una secuencia de caracteres. Sin embargo, a diferencia de una cadena, un símbolo literal tiene garantizada su unicidad global. Solo hay un objeto Símbolo #Hello pero puede haber varios objetos Cadena con el valor 'Hello'.

Arrays estáticos.

Los arrays estáticos o arrays en tiempo de compilación se definen mediante #( ), , que rodea a los literales separados por espacios. Todo lo que se encuentre dentro de los paréntesis debe ser una constante en tiempo de compilación. Por ejemplo, #(27 #(true false) abc) es un array literal de tres elementos: el entero 27, el array en tiempo de compilación que contiene los dos booleanos y el símbolo #abc.

Arrays dinámicos.

Arrays dinámicos o arrays en tiempo de ejecución. Las llaves { } definen un array (dinámico) en tiempo de ejecución. Los elementos son expresiones separadas por puntos. Así, { 1. 2. 1+2 } define un array con los elementos 1, 2, y el resultado de evaluar 1+2. (¡La notación con llaves es propia del dialecto Squeak de la familia Smalltalk! En otros Smalltalks, debes crear matrices dinámicas de forma explícita).

Comentarios.

Los comentarios se escriben entre comillas dobles. "hello" es un comentario, no una cadena, y el compilador Cuis-Smalltalk lo ignora. Los comentarios pueden abarcar varias líneas.

Declaración de variables locales.

Las barras verticales | | encierran la declaración de una o más variables locales en un método (y también en un bloque).

Asignación.

:= asigna un objeto a una variable. En la versión impresa del libro escribimos ← instead. en su lugar. Dado que este carácter no está presente en el teclado, se escribe con la tecla del carácter de subrayado. Por lo tanto, x := 1 es lo mismo que x ← 1 o x _ 1.

Bloques.

Los corchetes [ ] definen un bloque, también conocido como closure de bloque o closure léxico, que es un objeto de primera clase que representa una función. Como veremos, los bloques pueden tomar argumentos y tener variables locales.

Primitivas.

<primitive: ...> denota una invocación de una primitiva de máquina virtual. (<primitive: 1> es la primitiva de VM para SmallInteger>>+.) Cualquier código que siga a la primitiva se ejecuta solo si la primitiva falla. La misma sintaxis se utiliza también para las anotaciones de métodos.

Mensajes unarios.

Los mensajes unarios consisten en una sola palabra (como #factorial), que se envía a un receptor (como 3).

Mensajes binarios.

Los mensajes binarios son operadores (como +) que se envían a un receptor y toman un único argumento. En 3 + 4, el receptor es 3 y el argumento es 4.

Mensajes de palabra clave.

Los mensajes de palabras clave constan de varias palabras clave (como #raisedTo:modulo:), cada una de las cuales termina con dos puntos y toma un único argumento. En la expresión 2 raisedTo: 6 modulo: 10, el selector de mensajes raisedTo:modulo: toma los dos argumentos 6 y 10, uno después de cada dos puntos. Enviamos el mensaje al receptor 2.

Retorno de método.

Se utiliza ↑ para devolver un valor desde un método. (Debes escribir ^ para obtener el carácter ↑.)

Secuencias de declaraciones.

Un punto o parada completa (.) es el separador de sentencias. Al poner un punto entre dos expresiones, estas se convierten en sentencias independientes.

Cascadas.
Cadenas.

Hay dos tipos de composición de mensajes, en cascada y en cadena

El punto y coma «;» se utilizan para enviar series de mensajes al mismo receptor original. En Transcript show: 'hello'; cr primero envíamo el mensaje #show: 'hello' al receptor Transcript, y después se envía el mensaje unitario #cr al mismo receptor.

A veces resulta útil enviar una serie de mensajes al resultado del envío de un mensaje. En ColoredBoxMorph new :: color: Color blue; openInWorld. enviamos mensajes sucesivos a la nueva instancia ColoredBoxMorph, no a la clase ColoredBoxMorph.

Para comprender mejor las diferencias entre la cascada y la cadena de mensajes, fíjate en el resultado de las tres instrucciones siguientes:

3 + 4 squared
⇒ 19

3 + 4 ; squared
⇒ 9

3 + 4 :: squared
⇒ 49
Literal compuesto

Las comillas invertidas (`) se pueden utilizar para crear literales compuestos en tiempo de compilación. Todos los componentes de un literal compuesto deben ser conocidos cuando se compila el código.