Differences
This shows you the differences between two versions of the page.
Both sides previous revisionPrevious revisionNext revision | Previous revision | ||
teaching:cc4101:tareas:2015-2:tarea3 [2016/03/20 04:38] – fmosso | teaching:cc4101:tareas:2015-2:tarea3 [2016/03/25 18:42] (current) – old revision restored (2015/10/31 14:36) fmosso | ||
---|---|---|---|
Line 135: | Line 135: | ||
Aquí ocurre que por el tipo del argumento, reemplazar en esa expresión '' | Aquí ocurre que por el tipo del argumento, reemplazar en esa expresión '' | ||
Entienda la función '' | Entienda la función '' | ||
+ | ===== (1.0) Sistema de tipos extendido con casts ===== | ||
+ | Vamos a explicar como se comportan los cast con un ejemplo en Java <code java> | ||
+ | public void foo(Object obj){ | ||
+ | String str = (String)obj; | ||
+ | } | ||
+ | </ | ||
+ | En este caso el programador está intentando hacer un cast de Object a String. Esto tiene dos implicancias sobre el lenguaje. Primero, el cast funciona estáticamente como una forma que tiene el programador de expresarle al sistema de tipos que cierto valor tiene cierto tipo, permitiendole en este caso asignar '' | ||
+ | ==== Cast para tipos simples ==== | ||
+ | Considere: <code scheme> | ||
+ | {with : Num {id : (Any -> Any) | ||
+ | {fun {x : Any} : Any x}} | ||
+ | {+ 1 {id 2}}} | ||
+ | </ | ||
+ | Este programa es rechazado por el sistema de tipos pues '' | ||
+ | {+ 1 {cast Num {id 2}}} | ||
+ | </ | ||
+ | En tiempo de ejecución, tal como en el caso en Java, puede ocurrir que el elemento casteado no retorne un Num. Para evitar que la maquina terminare con un SEGFAULT se hace una válida dinámica en la máquina para un cast. | ||
+ | - Implemente la función '' | ||
+ | * Añada '' | ||
+ | * Modifique las funciones '' | ||
+ | > (parse '{cast Num #f}) | ||
+ | (cast (TNum) (bool #f)) | ||
+ | </ | ||
+ | - Actualice la función '' | ||
+ | > (compile (parse '{cast Num (and #t #f)})) | ||
+ | (list (BOOL_CONST #f) (BOOL_CONST #t) (AND) (CHECKCAST (MTNum))) | ||
+ | </ | ||
+ | - Implemente la función '' | ||
+ | ==== Casts para funciones ==== | ||
+ | El siguiente ejemplo no se puede ejecutar actualmente pues el sistema de tipos lo rechaza. <code scheme> | ||
+ | {with : Bool {id : (Any -> Any) | ||
+ | {fun {x : Any} : Any x}} | ||
+ | {with : Bool {g : ((Bool -> Bool) -> Bool) | ||
+ | {fun {f : (Bool -> Bool)} : Bool {f #t}}} | ||
+ | {with : Bool {f : (Bool -> Bool) | ||
+ | {fun {x : Bool} : Bool x}} | ||
+ | {g {id f}}}}} | ||
+ | </ | ||
+ | Esto sería solucionable si pudiésemos también castear funciones de la siguiente la forma: <code scheme> | ||
+ | {cast (Bool -> Bool) {id f}} | ||
+ | </ | ||
+ | Teniendo una forma de castear funciones, podemos hacer que el sistema de tipos acepte el código anterior. | ||
+ | <code scheme> | ||
+ | {with : Bool {id : (Any -> Any) | ||
+ | {fun {x : Any} : Any x}} | ||
+ | {with : Bool {g : ((Bool -> Bool) -> Bool) | ||
+ | {fun {f : (Bool -> Bool)} : Bool {f #t}}} | ||
+ | {with : Bool {f : (Bool -> Bool) | ||
+ | {fun {x : Bool} : Bool x}} | ||
+ | {g {cast (Bool -> Bool) {id f}}}}}} | ||
+ | </ | ||
+ | Para que la máquina sea capaz de realizar un cast entre funciones, debe implementar la función '' | ||
+ | > (m-subtype? (MTFun (MTNum) (MTNum)) | ||
+ | (MTFun (MTNum) (MTAny))) | ||
+ | #t | ||
+ | </ | ||