| Sintaxis | Qué representa | |
|---|---|---|
startPoint | un nombre de variable | |
Transcript | un nombre de variable global | |
self | pseudo-variable | |
1 | entero (decimal) | |
2r101 | entero (base 2) | |
16r1a | entero (base 16) | |
1.5 | número de coma flotante | |
2.4e7 | notación exponencial | |
$a | el carácter ‘a’ | |
'Hello' | La cadena “Hello” | |
#Hello | el 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 := 1 | asignar 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 factorial | un mensaje unitario | |
3 + 4 | un mensaje binario | |
2 raisedTo: 6 modulo: 10 | un amensaje de palabra clave | |
↑ true, ^ true | devuelve el valor true | |
Transcript show: 'hello'. Transcript cr | separador de expresión (.) | |
Transcript show: 'hello'; cr | mensaje en cascada (;) | |
ColoredBoxMorph new :: color: Color blue; openInWorld | mensaje en cadena (::) | |
`{ 3@4 . 56 . 'click me'}` | la composición del literal #(3@4 56 'click me') |
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.
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.
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.
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.
Los números de coma flotante se pueden especificar con su exponente en
base diez: 2.4e7 es 2.4 × 107.
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.
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'.
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'.
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 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).
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.
Las barras verticales | | encierran la declaración de una o más variables locales en un método (y también en un bloque).
:= 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.
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.
<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.
Los mensajes unarios consisten en una sola palabra (como
#factorial), que se envía a un receptor (como 3).
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.
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.
Se utiliza ↑ para devolver un valor desde un método. (Debes escribir ^ para obtener el carácter ↑.)
Un punto o parada completa (.) es el separador de sentencias. Al poner un punto entre dos expresiones, estas se convierten en sentencias independientes.
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
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.