Está en la página 1de 24

Programación Orientada a Objetos

Departamento de Computación, FCEyN, UBA


Cálculo de Objetos no tipado (ς cálculo) [Abadi&Cardelli,98]

Ingredientes
§ Objetos como única estructura computacional.
§ Los objetos son una colección de atributos nombrados
(registros).
§ Todos los atributos son métodos.
§ Cada método tiene una única variable ligada que representa a
self (this) y un cuerpo que produce un resultado.
§ Los objetos proveen dos operaciones:
§ envı́o de mensaje (invocación de un método)
§ redefinición de un método
Sintaxis

o, b ::“ x variable
| rli “ ςpxi qbi iP1..n s objeto
| o.l selección / envı́o de mensaje
| o.l Ø ςpxqb redefinición de método
Un objeto
def
o “ rl1 “ ςpx1 qr s, l2 “ ςpx2 qx2 .l1 s

§ o tiene dos métodos:


§ l1 retorna un objeto vacı́o r s.
§ l2 es un método que envı́a el mensaje l1 a self
(representado por el parámetro x2 ).
Atributos vs métodos

§ el cálculo ς no incluye explı́citamente atributos


(campos/fields).
§ los atributos se representan como métodos que no utilizan al
parámetro self. Por ejemplo, l1 en
def
o “ rl1 “ ςpx1 qr s, l2 “ ςpx2 qx2 .l1 s
§ De esta manera,
§ el envı́o de un mensaje representa también a la selección de un
atributo
§ la redefinición de un método representa también a la
asignación de un atributo
Notación

§ Atributo: r. . . , l “ b, . . .s es una abreviatura de


r. . . , l “ ςpxqb, . . .s cuando x no se usa en b.
§ Asignación de atributo: o.l :“ b denota o.l Ø ςpxqb cuando x
no se usa en b

Escribimos
def
o “ rl1 “ r s, l2 “ ςpx2 qx2 .l1 s
en lugar de
def
o “ rl1 “ ςpx1 qr s, l2 “ ςpx2 qx2 .l1 s
Sintaxis - Variables libres

ς es un ligador para el parámetro self xi en el cuerpo bi de la


expresión ςpxi qbi
Definición
fvpςpxqbq “ fvpbq z txu
fvpxq “ txu
ŤiP1..n
fvprli “ ςpxi qbi iP1..n sq “ fvpςpxi qbi q
fvpo.lq “ fvpoq
fvpo.l Ø ςpxqbq “ fvpo.lq Y fvpςpxqbq

Un término o es cerrado si fvpoq “ H.


Sustitución

xtc{xu “c
ytc{xu “y if x ‰ y
prli “ ςpxi qbiP1..n
i sqtc{xu “ rli “ pςpxi qbi qtc{xuiP1..n s
po.lqtc{xu “ potc{xuq.l
po.l Ø ςpyqbqtc{xu “ potc{xuq.l Ø ppςpyqbqtc{xuq
pςpyqbqtc{xu “ ςpy 1 qpbty 1 {yutc{xuq
if y 1 R fvpςpyqbq Y fvpcq Y txu
Equivalencia de términos (”)

§ Los términos ςpxqb y ςpyqpbty{xuq con y R fvpbq se consideran


equivalentes (α-conversión).
§ Dos objetos que difieren en el orden de sus componentes son
considerados equivalentes.
§ Por ejemplo,
def
o1 “rl1 “ ςpx1 qr s, l2 “ ςpx2 qx2 .l1 s
def
o2 “rl2 “ ςpx3 qx3 .l1 , l1 “ ςpx1 qr ss

son equivalentes (o1 ” o2 ).


Semántica operacional
Valores

v ::“ rli “ ςpxi qbi iP1..n s

Reducción big-step ÝÑ

[Obj]
v ÝÑ v

o ÝÑ v 1 v 1 ” rli “ ςpxi qbi iP1..n s bj tv 1 {xj u ÝÑ v j P 1..n


[Sel]
o.lj ÝÑ v

o ÝÑ rli “ ςpxi qbi iP1..n s j P 1..n


[Upd]
o.lj Ø ςpxqb ÝÑ rlj “ ςpxqb, li “ ςpxi qbi iP1..n´tju s
Ejemplos ra “ r s, l “ ςpxqx.as.l ÝÑ ...

[Obj]
“r s
hkkkikkkj
o ÝÑ o r sto{xu ÝÑ r s
[Sel]
“o.a
hkkkkkikkkkkj
o ÝÑ o px.aqto{xu ÝÑ r s
[Sel]
ra “ r s, l “ ςpxqx.as .l ÝÑ rs
loooooooooooomoooooooooooon
o
Ejemplos pra “ r s, l “ ςpxqx.as.l Ø ςpyqr sq.l ÝÑ ...

[Obj] [Obj]
o ÝÑ o “r s
[Upd]
hkkkikkkj
u ÝÑ ra “ r s, l “ r ss r stu{xu ÝÑ r s
[Sel]
pra “ r s, l “ ςpxqx.as .l Ø ςpyqr sq .l ÝÑ r s
loooooooooooomoooooooooooon
o
loooooooooooooooooooooomoooooooooooooooooooooon
u
Ejemplos ra “ ςpxqx.as.a ÝÑ ...

..
.
[Sel]
“o.a
[Obj]
hkkkikkkj
o ÝÑ o x.ato{xu ÝÑ
[Sel]
ra “ ςpxqx.as .a ÝÑ
looooooomooooooon
o

La evaluación de esta expresión se indefine (análogo a


fix λx : σ.x).
Ejemplo: Los naturales

§ Asumir que existen los objetos true y false que


corresponden a los valores booleanos (Ver práctica)
§ Luego
def
zero “ r iszero “ true,
pred “ ςpxqx,
succ “ ςpxqpx.iszero :“ falseq.pred :“ xs
def
uno “ zero.succ
uno ÝÑ riszero “ false, pred “ zero, succ “ . . .s
looooooooooooooooooooooooooomooooooooooooooooooooooooooon
uno1
def
dos “ zero.succ.succ
dos ÝÑ riszero “ false, pred “ uno1 , succ “ . . .s
...
Las funciones

§ Es posible codificar los términos del cálculo λ (no tipado).

M ::“ M N | λx.M | x
§ Idea:
§ Representar a una función como un objeto
rarg “ . . . , val “ . . .s.
§ Al aplicar una función, primero se asigna el valor del
argumento al atributo arg y luego se envı́a el mensaje val que
evalúa el cuerpo de la función.
§ pf vq se traduce en pof .arg :“ ov q.val
Codificación del cálculo lambda J K : M Ñ a
def
JxK “x
def
JM N K “ pJM K.arg :“ JN Kq.val
def
Jλx.M K “ r val “ ςpyqJM Kty.arg{xu,
arg “ ςpyqy.arg s y R fvpM q
pλx.xqv
def
Jλx.xK “ rval “ ςpyqJxKty.arg{xu, arg “ ςpyqy.args
“ rval “ ςpyqxty.arg{xu, arg “ ςpyqy.args
“ rval “ ςpyqy.arg, arg “ ςpyqy.args
def
Jpλx.xq M K “ pJλx.xK.arg :“ JM Kq.val
“ prval “ ςpxqx.arg, arg “ ςpxqx.args.
arg :“ JM Kq.val
ÝÑ JM K

siempre que JM K sea un objeto.


Qué sucede al evaluar Jλx.xK.val y al evaluar Jpλx.xq yK?
Métodos con parámetros

Un método que espera un parámetro es un método cuya definición


es (un objeto que codifica a) una función.

ςpyqJλx.M K

Notación
§ λpxqM en lugar de Jλx.M K
§ M pN q en lugar de JM N K
Ejemplo: Punto en el plano

§ Un punto en el plano que puede ser desplazado y se encuentra


inicialmente en el origen de coordenadas.
def
origen “ r x “ 0,
y “ 0,
mv x “ ςppqλpdx qp.x :“ p.x ` dx ,
mv y “ ςppqλpdy qp.y :“ p.y ` dy s
§ Luego,
def
unidad “ origen.mv x p1q.mv yp1q
ÝÑ rx “ 1, y “ 1, mv x “ . . . , mv y “ . . .s
(Stateless) Traits

§ Un trait es una colección de ciertos métodos.


§ (Stateless) Traits no especifican variables de estado ni
acceden al estado.

def
CompT “ r eq “ ςptqλpxqλpyqpx.comppyqq ““ 0,
lt “ ςptqλpxqλpyqpx.comppyqq ă 0 s
(Stateless) Traits

§ Los podemos pensar como una colección de pre-métodos:


§ pre-método: ςptqλpyqb con t R fvpλpyqbq (no usan el
parámetro self t).
§ Recordar que en este caso podemos omitir ςptq y escribir
λpyqb.
§ Luego, t “ rli “ λpyi qbi iP1..n s es un trait.
§ A partir de un trait t “ rli “ λpyi qbi iP1..n s podemos definir un
constructor de objetos (cuando t es completo).
def
new “ λpzqrli “ ςpsqz.li psqiP1..n s

def
o “ new ptq
« rli “ ςpsqt.li psqiP1..n s
« rli “ ςpyi qbi iP1..n s
(Stateless) Traits

def
CompT “ r eq “ ςptqλpxqλpyqpx.comppyqq ““ 0,
lt “ ςptqλpxqλpyqpx.comppyqq ă 0 s
def
new “ λpzqrli “ ςpsqz.li psqiP1..n s

r eq “ ςpsqCompT.eqpsq
new pCompTq«
lt “ ςpsqCompT.ltpsq s
r eq “ ςpsqλpyq ps.comppyqq ““ 0,
«
lt “ ςpsqλpyq ps.comppyqq ă 0 s

§ Este objeto es inutilizable (porque CompT no es completo ya


que comp no es un método de CompT).
Clases

§ Una clase es un trait (completo) que además provee un


método new.
def
c “ r new “ ςpzqrli “ ςpsqz.li psqiP1..n s,
li “ λpsqbi iP1..n s
§ Luego,
def
o “ c.new
ÝÑ rli “ ςpsqc.li psqiP1..n s
« rli “ ςpsqbi iP1..n s
Clase Contador

def
Contador “ r new “ ςpzqr v “ ςpsqz.vpsq,
inc “ ςpsqz.incpsq,
get “ ςpsqz.getpsqs,
v “ λpsq0,
inc “ λpsqs.v :“ s.v ` 1,
get “ λpsqs.v ]
Representando Herencia

§ Sea la clase
def
c “ r new “ ςpzqrli “ ςpsqz.li psqiP1..n s,
li “ λpsqbi iP1..n s

§ Se desea definir c1 como subclase de c que agrega los


pre-métodos λpsqbk kPn`1..n`m
def
c1 “ r new “ ςpzqrli “ ςpsqz.li psqiP1..n`m s,
lj “ c.lj jP1..n
lk “ λpsqbk kPn`1..n`m s
§ En una subclase también se puede redefinir pre-métodos.
Consideraciones adicionales

§ El cálculo tiene un sabor funcional.


§ Existe una versión imperativa, donde se mantienen un store
con referencias a objetos.
§ Clonepaq crea un nuevo objeto que tiene las mismas etiquetas
de a y cada componente comparte los métodos con las
componentes de a.
§ Introduce herencia a nivel de objetos
§ las primitivas fueron seleccionadas desde una perspectiva de
tipado estático.
§ No se pueden agregar o eliminar dinámicamente métodos en
un objeto.
§ Los métodos no pueden extraerse de los objetos.
§ Las distintas versiones vienen equipadas con un sistema de
tipos.
§ Existe una diferencia significativa en el tipado de λ y ς (la
contravarianza en el parámetro self falla).

También podría gustarte