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:41] – [(0.5) Sistemas de Tipos Simple] fmosso | teaching:cc4101:tareas:2015-2:tarea3 [2016/03/25 18:42] (current) – old revision restored (2015/10/31 14:36) fmosso | ||
---|---|---|---|
Line 95: | Line 95: | ||
- (1.0) Implemente la función '' | - (1.0) Implemente la función '' | ||
===== (0.5) Sistemas de Tipos Simple ===== | ===== (0.5) Sistemas de Tipos Simple ===== | ||
- | Se implementará | + | En la tarea anterior se abordó el chequeo de tipos en el lenguaje de predicados. En esta ocasión extenderemos |
- | - Implemente | + | - Extienda((Tome la función de la tarea anterior como punto de partida)) |
* Para una función se válida que la expresión del cuerpo tenga el mismo tipo declarado en el retorno de la función. En caso de pasar la validación el tipo resultante es '' | * Para una función se válida que la expresión del cuerpo tenga el mismo tipo declarado en el retorno de la función. En caso de pasar la validación el tipo resultante es '' | ||
* Para la aplicación de función se valida que el primer argumento es efectivamente una función y que el tipo del segundo argumento de la aplicación (argumento real) coincide con el tipo del argumento (formal) de la función. En dicho caso la aplicación tiene el tipo del retorno de la función. | * Para la aplicación de función se valida que el primer argumento es efectivamente una función y que el tipo del segundo argumento de la aplicación (argumento real) coincide con el tipo del argumento (formal) de la función. En dicho caso la aplicación tiene el tipo del retorno de la función. | ||
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 | ||
+ | </ | ||