Está en la página 1de 8

Paradigmas de Lenguajes de Programaci

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

Paradigmas de Lenguajes de Programaci


on
1er Cuatrimestre de 2007

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

Paradigmas de Lenguajes de Programaci


on
1er Cuatrimestre de 2007

(posPatron > patron size) ifTrue: [^true].


(posCadena > self size) ifTrue: [^false].
].
^false.
i. Cual es el efecto del mensaje verificar:aPartirDe: cuando es enviado con parametros adecuados a un objeto adecuado?
ii. Cual es el resultado de las siguientes evaluaciones?
i.
Or. Objetos verificar: Obj aPartirDe: 5
ii. Or. Objetos verificar: #($O $b $j) aPartirDe: 5
iii. Or. Objetos verificar: Obj aPartirDe: 4
iv. Or. Objetos verificar: O aPartirDe: 5
v.
#($O $b $j $t) verificar: bj aPartirDe: 3
vi. #($O $b $j $t) verificar: #($b $j) aPartirDe: 2
iii. Si se modifica el metodo verificar:aPartirDe: cambiando la quinta lnea por:
cadenaChar := self asUpperCase at: posCadena.
cuales son los resultados de las evaluaciones del tem anterior?
Ejercicio 6
Agregar un metodo a la clase Number que represente la estructura de control for. El metodo
debe poseer la siguiente interfaz:
on step: incremento body: cuerpo
valor inicial to: condici
Donde valor inicial es una instancia cualquiera de Number, condici
on es un bloque de
codigo de un argumento que devuelve true o false, incremento es un bloque de codigo de
un argumento que devuelve un valor, y cuerpo es un bloque de codigo de un argumento.
La expresi
on debe devolver nil.
Por ejemplo, la siguiente expresi
on imprime 1234 y eval
ua a nil:
1 to: [:i | i < 5] step: [:i | i + 1] body: [:i | Transcript show: i printString]
Ejercicio 7
Definir una clase Complex que implemente la clase de los n
umeros complejos. Definir los
siguientes metodos:
i. Re e Im, que devuelvan la parte real e imaginaria, respectivamente, del objeto receptor.
ii. re:im:, tal que el mensaje re:a im:b inicialice el objeto receptor con parte real a y
parte imaginaria b.
iii. sum:, tal que el efecto de c sum:d sea actualizar c con c+d, donde + es la suma de
n
umeros complejos.
iv. abs, que devuelva el valor absoluto del objeto receptor.
v. + (infijo), que devuelva la suma compleja de sus dos argumentos.
vi. printOn: para mostrar complejos de modo adecuado. Sugerencia: ver como esta implementado el metodo con el mismo nombre en la clase predefinida Fraction.

P
agina 3 de 8

Paradigmas de Lenguajes de Programaci


on
1er Cuatrimestre de 2007

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

Paradigmas de Lenguajes de Programaci


on
1er Cuatrimestre de 2007

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

Paradigmas de Lenguajes de Programaci


on
1er Cuatrimestre de 2007

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

Paradigmas de Lenguajes de Programaci


on
1er Cuatrimestre de 2007

i. En Smalltalk, agregar a la clase Collection un metodo con la siguiente interfaz:


inject: primerValor and: segundoValor into: operacion
donde operacion es un bloque de codigo de tres argumentos que se eval
ua una vez por
cada elemento del receptor, con dicho elemento como tercer argumento. En la n-esima
evaluaci
on, el primer y segundo argumento de operacion corresponden al resultado
de la evaluaci
on n-1 y n-2 respectivamente. La primera evaluacion comienza evaluando
operacion, con primerValor como primer argumento, segundoValor como segundo
argumento, y el primer elemento del receptor como tercer argumento. La segunda evaluaci
on toma el segundoValor como primer argumento y el resultado de la primera
evaluaci
on como segundo argumento. El metodo debe devolver la u
ltima evaluacion de
operacion. El orden de recorrido de los elementos es el dado por el do:.
Por ejemplo, la evaluaci
on de la siguiente expresion:
#(c d e) inject: a and: b into: [:a :b :c | a, b, c]
da como resultado: abcbabcde (el resultado es cada iteracion sera: 1)abc, 2)babcd
y 3)abcbabcde)
ii. Utilizando inject:and:into:, definido en el item anterior, se pide redefinir el metodo
usual de Collection:
inject: valor into: operacion
de forma tal que se comporte exactamente como la version original de inject:into:.
Ayudas:
La clase BlockClosure tiene definido el metodo value:, que eval
ua el bloque receptor pas
andole un par
ametro. Tambien estan disponibles en la misma clase los metodos
value:value: y value:value:value: para bloques de dos y tres argumentos respectivamente.
Ejemplo: [:n|n*2] value: 10 devuelve 20.
Ejercicio 14
i. En Smalltalk, agregar a la clase Collection un metodo con la siguiente interfaz:
selectAnd: unasCondiciones
donde unasCondiciones es una coleccion de bloques de codigo (es decir, instancias de
la clase BlockClosure) con un parametro de entrada cada uno y que devuelven un valor
booleano. A diferencia del metodo select: basico, este metodo requiere que todas las
condiciones sean verdaderas para incluir un elemento de la coleccion receptora en la
colecci
on resultado.
Por ejemplo, la evaluaci
on de la siguiente expresion:
#(1 5 2 4 7 3 6) selectAnd: (Array with: [:i
devuelve #(5 7)

| i odd] with: [:i

| 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

Paradigmas de Lenguajes de Programaci


on
1er Cuatrimestre de 2007

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

También podría gustarte