Documentos de Académico
Documentos de Profesional
Documentos de Cultura
on
1er Cuatrimestre de 2007
Pr
actica No 6 - Smalltalk
Para resolver esta pr
actica, recomendamos usar el entorno VisualWorks, de distribucion
gratuita, que puede bajarse del sitio web de la materia bajo la seccion Links.
Ejercicios introductorios
Ejercicio 1
Que responde Smalltalk cuando se le pide evaluar las siguientes expresiones?
i.
ii.
iii.
iv.
v.
vi.
vii.
viii.
ix.
x.
xi.
xii.
xiii.
1
1 class
(1+1)
(1+1) class
hola, mundo
hola, mundo class
#(7 6 5)
#(7 6 5) class
#(7 6 5) at: 1
(#(7 perro 5.24 $a)
(#(7 perro 5.24 $a)
(#(7 perro 5.24 $a)
(#(7 perro 5.24 $a)
at:1)
at:2)
at:3)
at:4)
class
class
class
class
Ejercicio 2
Que responde Smalltalk cuando se le pide evaluar las siguientes expresiones? Al evaluar una
expresion, tener en cuenta el ambiente producido por las evaluaciones previas. Las variables
en may
usculas representan variables globales.
i.
ii.
iii.
iv.
v.
vi.
vii.
viii.
ix.
x.
xi.
xii.
xiii.
x := 2
X := 2
X := X+1
Y := Y+1
Y
Y := (2 3 4)
Y := #(2 3 4)
Y at :1
Y := Y at :2
|n| n := 4
n
|n| n := n+1
|n m| n := 4. m := 1. ^(n+m+X+Y)
Ejercicio 3
Idem que el ejercicio anterior, suponiendo que se ha salvado la imagen producida por el.
P
agina 1 de 8
i.
ii.
iii.
iv.
v.
vi.
vii.
viii.
ix.
x.
xi.
xii.
xiii.
xiv.
xv.
xvi.
xvii.
xviii.
xix.
[X. Y]
[X. Y] class
[X. Y] value
Duplicar := [:n | 2*n]
Duplicar value
Duplicar value:5
(Objeto at:2) isVowel ifTrue: [2. 3] ifFalse: [3. 4]
[X>0] whileTrue: [X := X - 1]
X
5 timesRepeat: [X := X + Y]
X
A := Array new. A := #(1 2 3 4 5 6 7)
A do: [:n | X := X + n]. ^X
A select: [:i | i factorial < (i*i)]
A reject: [:i | (i even) & (i>4)]
A collect: [:i | X + Y + i]
2 to:5 do:[:i | A at:i put:2*i]
A
[X<10] whileTrue: [X:=X+1. X==5 ifTrue: [^X]]
Dise
no de Clases y Manejo de Colecciones
Ejercicio 4
Implementar los siguientes metodos:
i. to: do: usando el metodo whileTrue:.
ii. do: para la clase Array usando whileFalse:.
iii. reject: usando select: y not.
Ejercicio 5
Considerar el metodo de instancia verificar:aPartirDe:, implementado en la clase
SequenceableCollection (superclase de las clases String y Array entre otras).
Tener en cuenta que s
olo la clase String posee un metodo de instancia asUpperCase cuyo
efecto es cambiar las min
usculas del objeto receptor por las may
usculas correspondientes.
El metodo at: se encuentra implementado en la clase Object, superclase de Collection,
que es a su vez superclase de SequenceableCollection.
verificar: patron aPartirDe: unIndice
|posCadena posPatron cadenaChar patronChar|
posCadena := unIndice.
posPatron := 1.
[ cadenaChar := self at: posCadena.
patronChar := patron at: posPatron.
cadenaChar = patronChar ] whileTrue:
[ posCadena := posCadena + 1.
posPatron := posPatron + 1.
P
agina 2 de 8
P
agina 3 de 8
Herencia
Ejercicio 8
Sean las clases Uno, Dos y Tres, tales que Tres es subclase de Dos, y Dos es subclase de Uno.
Las tres clases tienen metodos a y b definidos as:
Class:
Uno
Methods:
Class:
Dos
Methods:
Class:
Tres
Methods:
a
^2.
a
^8.
a
^super b.
b
^self a.
b
^super b.
b
^super a.
Sean uno, dos y tres instancias de las clases Uno, Dos y Tres respectivamente. Cuales
son los resultados de las siguientes evaluaciones?
i.
ii.
iii.
iv.
v.
vi.
uno a
uno b
dos a
dos b
tres a
tres b
Ejercicio 9
Se tienen definidas en Smalltalk las clases A, B y C. Todos los metodos presentados son de
instancia, con excepci
on del metodo new de la clase C, que es un metodo de clase.
Object subclass: #A
print
Transcript show: Soy la clase A.
hacerAlgo
self print.
A subclass: #B
print
Transcript show: Soy la clase B.
B subclass: #C
print
Transcript show: Soy la clase C.
hacerAlgo
super print.
new
^super new.
Que mensajes se imprimen en el Transcript, si dentro de una ventana de Workspace se
eval
uan las siguientes expresiones?
P
agina 4 de 8
i.
ii.
b
b
c
c
:= B new.
hacerAlgo.
:= C new.
hacerAlgo.
Ejercicio 10
Se tienen las clases A, B, C, D donde A es superclase de B y C, y C es superclase de D, y no hay
otra relaci
on de herencia entre ellas cuatro. Como debe hacerse para conseguir que valga lo
siguiente?
i. x esA debe devolver true para cada instancia x de A o de sus subclases, y false para
cada x que no sea instancia de A ni de sus subclases.
ii. x esBoC debe devolver true para cada instancia x de B o de C, o de las subclases de
ambas, pero false para cada x que no sea instancia de B ni de C ni de subclases de
ellas.
iii. x esSoloC debe devolver true para cada instancia x de C y false para cada instancia
de cualquier otra clase, inclusive subclases de C.
Ejercicio 11
Se tienen 2 clases: A y B tal que B es subclase de A. Cada una tiene una variable de instancia,
a y b respectivamente, con metodos de instancia para asignar y obtener los valores.
La clase A tiene 2 metodos de instancia:
imprimir
self calcular.
calcular
^((self geta) + 1).
La clase B tiene 2 metodos de instancia:
imprimir
|b|
b:=self calcular.
super imprimir.
calcular
^((self getb) * 2).
Dado el siguiente c
odigo:
|a b|
a:= A new. b:= B new.
a seta:2.
b seta:3. b setb:4.
a imprimir.
b imprimir.
Describa brevemente la ejecuci
on. Que se devuelve? Describa el contenido de las variables
de instancia de cada objeto, al finalizar la ejecucion.
P
agina 5 de 8
Ejercicios de Parcial
Ejercicio 12
i. En Smalltalk, agregar a la clase Collection un metodo con la siguiente interfaz:
collectCircular: unosBloques
donde unosBloques es una coleccion secuencial de bloques de codigo (es decir, instancias
de la clase BlockClosure) con un parametro de entrada cada uno. A diferencia del
metodo collect:, este metodo aplica a cada elemento de la coleccion receptora del
mensaje un bloque de c
odigo perteneciente a unosBloques. El orden de aplicacion de
los bloques debe ser circular, comenzando con el primero y aplicando uno por vez. La
colecci
on unosBloques no debe ser modificada por el metodo.
Por ejemplo, la evaluaci
on de la siguiente expresion:
#(1 2 4 3) collectCircular: (Array with: ([:i | i * 2]) with: ([:i | i + 1])
with: ([:i | hola]))
da como resultado: #(2 3 hola 6)
ii. Se cuenta con la clase Mazo, subclase de OrderedCollection, que contiene una secuencia
de cartas. Tambien est
a disponible la clase Jugador, que posee un metodo de instancia
tomarCarta:, que recibe una carta y la agrega a la mano del jugador. Utilizando el
metodo collectCircular:, definido en el item anterior, se pide definir el siguiente
metodo en la clase Mazo:
repartir: unosJugadores
donde unosJugadores es una coleccion secuencial de objetos de tipo Jugador. El metodo
repartir debe repartir las cartas del mazo entre los jugadores lo mas equitativamente
posible. Esto significa que si la cantidad de cartas es m
ultiplo de la cantidad de jugadores,
todos los jugadores terminar
an con la misma cantidad de cartas, y en caso contrario un
subconjunto de los jugadores se quedara con una carta menos. Deben repartirse todas
las cartas del mazo, y el mazo debe quedar vaco luego de invocar a repartir:. El
metodo devuelve nil.
Ayudas:
La clase BlockClosure tiene definido el metodo value:, que eval
ua el bloque receptor
pasandole un par
ametro.
Ejemplo: [:n|n*2] value: 10 devuelve 20.
Las colecciones secuenciales (subclases de SequenceableCollection) tiene definido el
metodo at:, cuyo u
nico par
ametro es un ndice y devuelve el elemento cuyo ndice es
el especificado.
Ejemplo: #(7 8 10 9) at: 3 devuelve 10.
Asumir que la clase Mazo posee el metodo removeAll que elimina todos las cartas del
mazo receptor.
Ejercicio 13
P
agina 6 de 8
| i >= 5] )
ii. Se cuenta con la clase Red, subclase de Set, que contiene un conjunto de maquinas (instancias de la clase Maquina). La clase Maquina tiene un metodo de instancia recursos
que devuelve el conjunto de recursos disponibles en esa maquina (por ejemplo: impresoras, scanners, etc.). Utilizando el metodo selectAnd:, se pide agregar el siguiente
metodo en la clase Red:
P
agina 7 de 8
findRecursos: unasCondiciones
donde unasCondiciones es una coleccion de bloques con un parametro de entrada y
que devuelven un valor booleano. El metodo findRecursos: debe devolver todos los
recursos, sin importar a que m
aquina estuvieran asociados, que cumplan con todas las
condiciones recibidas como par
ametros.
Ayudas:
La clase BlockClosure tiene definido el metodo value:, que eval
ua el bloque receptor
pasandole un par
ametro.
Ejemplo: [:n|n*2] value: 10 devuelve 20.
Las colecciones tienen un metodo addAll: que recibe una coleccion y agrega todos los
elementos de dicha colecci
on a la coleccion receptora
Ejemplo: (Set with: 7 with: 8 with: 10) addAll: #(4 5); yourself devuelve a
Set(4 5 7 8 10). Tener en cuenta que addAll: devuelve como resultado la coleccion
que recibi
o como par
ametro.
Ejercicio 15
i. Agregar a la clase Collection un metodo con la siguiente interfaz:
collectCond: unaCondicion ifTrue: bloque1 ifFalse: bloque2
donde unaCondicion, bloque1 y bloque2 son bloques con un parametro de entrada
cada uno. Este metodo tiene un comportamiento parecido a collect:, pero en lugar de
aplicar el mismo bloque de c
odigo a cada elemento de la coleccion receptora del mensaje,
aplica bloque1 a los elementos para los cuales vale unaCondicion, y bloque2 a aquellos
para los que no vale.
Por ejemplo, la evaluaci
on de la siguiente expresion:
#(1 2 4 3) collectCond: [:i | i even] ifTrue: [:i | i+1] ifFalse: [:i | i*3]
da como resultado #(3 3 5 9), porque a los elementos pares les suma 1 y a los impares
los triplica.
ii. Utilizando collectCond:ifTrue:ifFalse:, agregar a la clase SequenceableCollection
un metodo con la siguiente interfaz:
collect: bloque1 alt: bloque2
donde bloque1 y bloque2 son bloques con un parametro de entrada cada uno. Este metodo tiene un comportamiento parecido a collect:, pero aplica bloque1 a las
posiciones con ndice impar, y bloque2 a las posiciones con ndice par.
Por ejemplo, la evaluaci
on de la siguiente expresion:
#(1 2 4 3) collect: [:i | i+1] alt: [:i | i*3]
devuelve #(2 6 5 9), porque a los elementos con ndice impar les suma 1 y a los de
ndice par los triplica.
P
agina 8 de 8