Dr. Carlos A. Coello Coello
Departamento de Computación
CINVESTAV‐IPN
[email protected]
Iteración
Los ciclos con la decisión al inicio pueden formarse en
Smalltalk usando la palabra clave “method
whileTrue:”, la cual es proporcionada por la clase
“Block”.
Esta palabra clave se usa para enviar el bloque a ser
controlado por un segundo bloque que contiene la
condición del ciclo.
Iteración
Este método está definido para todos los bloques que
regresen objetos Booleanos.
El método “whileTrue:” está definido para enviar
“value” al objeto que contenga el método (ya sea
“true” o “false”), causando en consecuencia que se
ejecute el bloque que se le pasó como parámetro.
Iteración
Ejemplo:
count 0.
sum 0.
[count <= 20] “El bloque con la condicion
del ciclo”
whileTrue: [sum sum + count.
cuerpo del ciclo”
count count + 1]
”El
Iteración
Otra estructura de control común para ciclos es la
simple repetición mediante un contador.
Para esto, existe un método para los enteros llamado
“timesRepeat:”.
Cuando se envía “timesRepeat:” a un entero con un
bloque como parámetros, dicho bloque se ejecuta el
número indicado de veces.
Iteración
Ejemplo:
xCube 1.
3 timesRepeat: [xCube xCube * x]
Esto calcula el cubo de “x” mediante un proceso
bastante tedioso.
Iteración
Pueden construirse estructuras de control para ciclos
similares a las de Algol‐68 usando algunos de los
métodos para enteros que proporciona Smalltalk.
Los dos métodos más útiles son: “to:do:” y “to:by:do”.
Iteración
Ejemplo:
1 to: 5 do: [sum sum + x]
Este bloque es ejecutado 5 veces.
Los valores internos producidos y regresados por el
objeto “1” son: 1, 2, 3, 4 y 5.
Iteración
Un ejemplo del segundo método es:
2 to: 10 by: 2 do: [:even | sum sum +
even]
Este mensaje hace que el bloque se ejecute 5 veces,
pero en este caso los valores internos producidos son:
2, 4, 6, 8 y 10.
Selección
Se proporciona el método “ifTrue:ifFalse:” para los
objetos “true” y “false”.
Los dos argumentos del mensaje “ifTrue:ifFalse:”
representan las cláusulas “then” y “else” del
constructor de selección.
Selección
Este mensaje se envía a una expresión Booleana.
Si la expresión se evalúa a cierto (true), entonces el
mensaje se envía a “true”.
En este caso, el método “ifTrue:ifFalse:” envía “value”
a su primer argumento e ignora el segundo.
Si se evalúa a falso, entonces ocurre lo opuesto.
Selección
Ejemplo:
total = 0
ifTrue: [average 0]
ifFalse: [average sum // total]
Selección
En este caso, la expresión Booleana “total=0” hace que
el mensaje “=0” se envíe al objeto “total”.
Esto regresa ya sea “true” o “false”.
El objeto resultante es usado después como el receptor
del mensaje, el cual se envía al método
“ifTrue:ifFalse”.
Selección
Los dos parámetros de este método son los bloques
“then” y “else”, respectivamente, de los cuales sólo uno
es ejecutado.
El operador // especifica que se desea realizar una
división entera.
Métodos
Un método de una clase define las operaciones que
una instancia de la clase ejecutará cuando se reciba un
mensaje correspondiente a ese método.
En cierto sentido, los métodos son como las
definiciones de funciones, incluyendo el uso de
parámetros y la capacidad de regresar valores.
Métodos
La forma sintáctica general de un método en Smalltalk
es:
patrón_del_mensaje [ | variables temporales | ]
sentencias
donde los corchetes son meta‐símbolos que indican
que lo que se encuentra dentro de ellos es opcional.
Métodos
Dado que Smalltalk no tiene declaraciones de tipo, las
variables temporales, cuando están presentes, sólo
necesitan ser nombradas en una lista.
Las variables temporales existen sólo durante la
ejecución del método en el cual están listadas.
No hay signos de puntuación al final de un método.
Métodos
El mensaje del patrón corresponde a las sentencias
procedurales de lenguajes imperativos tales como
Pascal.
Los patrones de mensajes, los cuales son prototipos
para los mensajes, pueden estar en una de dos formas
básicas.
Métodos
Para los mensajes unarios o binarios, sólo se incluye el
nombre del método.
Para los mensajes de palabra clave, se incluyen las
palabras clave y los nombres de los parámetros del
patrón de mensaje.
Métodos
Para indicar que un método regresará un valor, se
utiliza la flecha hacia arriba (^).
En muchos casos, esta es la última expresión que
aparece en el método.
Si no se especifica un valor de retorno en un método, el
objeto receptor mismo es el valor de retorno.
Clases
Todos los objetos de Smalltalk son instancias de clases.
Una clase tiene cuatro partes:
1) Un nombre (de la clase).
2) El nombre de la superclase, el cual especifica la
posición de la nueva clase en la jerarquía de clases del
sistema.
Clases
3) Una declaración de las variables locales, llamadas
variables instanciadas.
Estas declaraciones estarán disponibles a las instancias
de la clase.
Clases
4) Los métodos que definen cómo responderán las
instancias de la clase a los mensajes.
(Recordemos que un objeto hereda también el método
de todas las clases que son sus ancestros).
Clases
Los mensajes a un objeto normalmente hacen que se
busque un método correspondiente en la clase a la que
el objeto pertenece.
Si la búsqueda falla, se continúa ésta en la superclase
de esa clase y así sucesivamente, hasta llegar a la clase
del sistema, llamada “Object”, la cual no tiene
superclase.
Clases
Si no se encuentra un método en ninguna parte de esa
cadena, entonces ocurre un error.
Es importante recordar que este método de búsqueda
es dinámico.
Clases
Ejemplo de una definición de clase:
"Smalltalk Example Program"
"The following is a class definition, instantiations
of which can draw equilateral polygons of any
number of sides"
class name
superclass
Polygon
Object
Clases
ourPen
numSides
sideLength
instance variable names
"Class methods"
"Create an instance"
new
^ super new getPen
Clases
"Get a pen for drawing polygons"
getPen
ourPen Pen new
"Instance methods"
"Draw a polygon"
draw
numSides timesRepeat: [ourPen go: sideLength;
turn: 360 // numSides]
Clases
"Set length of sides"
length: len
sideLength len
"Set number of sides"
sides: num
numSides num
Clases
Smalltalk sigue el Principio de Abstracción al
agrupar los objetos que tienen comportamiento y
propiedades similares bajo la misma clase.
Nótese que simultáneamente, los particulares que
distinguen un objeto de otro se omiten.
Clases
Este enfoque resulta ideal para simulación y es una
muestra de la fuerte influencia de Simula‐67 en
Smalltalk.
La memoria privada de una instancia de una clase
contiene sus variables instanciadas.
Clases
Las variables instanciadas no son visibles a otros
objetos.
Cada variable instanciada se refiere a un objeto, al que
se denomina “valor”.
Los valores de todas las instancias de una cierta variable
representan (en su conjunto) el estado actual de esa
instancia.
Clases
Las variables instanciadas pueden ser “nombradas” o
“indizadas”.
Las variables nombradas corresponden a apuntadores
a tipos distintos de los arreglos en un lenguaje
imperativo.
Las variables indizadas se acceden, no mediante su
nombre, sino mediante los mensajes que usan
parámetros enteros.
Clases
La mayor parte de las variables indizadas se usan de tal
forma que corresponden a arreglos en lenguajes
imperativos convencionales, aunque la indización
misma se realiza a través del paso de mensajes.
Clases
El parámetro entero en un mensaje se usa para
referenciar una variable indizada instanciada y
corresponde al subíndice de un arreglo en un lenguaje
imperativo convencional.
Clases
Las instancias de una clase se crean enviando el mensaje
“new” a la clase en una asignación, la cual hace que la
variable a su izquierda haga referencia al nuevo objeto
recién creado.
Por ejemplo:
Clases
ourPen Pen new
crea una instancia de la clase “Pen” (enviando el
mensaje “new” a la clase “Pen”).
Clases
Esto también hace que la variable “ourpen” haga
referencia a esta nueva instancia de la clase “Pen”.
Este ejemplo demuestra que pueden enviarse mensajes
tanto a las clases como a los objetos.
Chequeo de Tipos
Las variables de Smalltalk no tienen tipo; cualquier
nombre puede asociarse con cualquier objeto.
El único chequeo de tipos que se efectúa ocurre
cuando dinámicamente cuando un mensaje se envía a
un objeto.
Chequeo de Tipos
Si el objeto es una de sus clases previas (ancestro),
entonces tiene un método para el mensaje, el mensaje
es legal y el objeto reacciona a él.
Si no hay método que corresponda a un mensaje, ya
sea en el objeto en una de sus clases ancestrales,
entonces se produce un error en tiempo de ejecución.
Chequeo de Tipos
Este es un concepto de chequeo de tipos
significativamente diferente del utilizado en los
lenguajes imperativos.
El chequeo de tipos en Smalltalk tiene como objetivo
simplemente asegurar que un mensaje corresponde a
un cierto método.
Chequeo de Tipos
Advierta que el chequeo dinámico de tipos no implica
en este caso un chequeo débil de tipos.
Smalltalk tiene un chequeo fuerte de tipos, a pesar de
que éste es dinámico (en vez del chequeo estático de
lenguajes como Pascal y Ada).
Chequeo de Tipos
Una ventaja del chequeo dinámico de tipos es su
flexibilidad, ya que podemos hacer el mismo trabajo que
con los paquetes genéricos de Ada, pero sin recurrir a la
inherente complejidad de esa técnica.
Chequeo de Tipos
Puesto que Smalltalk es un lenguaje interpretado y no
compilado, el activar mensajes en tiempo de ejecución
es algo aceptable y la motivación para detectar tan
temprano como sea po
Comentarios de: Lenguajes de Programación (0)
No hay comentarios