Differences
This shows you the differences between two versions of the page.
Both sides previous revisionPrevious revisionNext revision | Previous revisionNext revisionBoth sides next revision | ||
teaching:cc4101:tareas:2015-2:tarea3 [2015/10/17 20:40] – [(1.0) Índices De Bruijn] racruz | teaching:cc4101:tareas:2015-2:tarea3 [2016/03/20 01:49] – [(1.0)Funciones con n-argumentos] fmosso | ||
---|---|---|---|
Line 59: | Line 59: | ||
| | ||
> (deBruijn (add (num 1) (id 'x))) | > (deBruijn (add (num 1) (id 'x))) | ||
- | ;Arroja error " | + | ;Arroja error " |
</ | </ | ||
- | ==== (1.0) De AST a código de máquina ==== | + | ==== De AST a código de máquina ==== |
Vamos abordar la compilación del AST de una expresión al set de instrucciones de la SECD. | Vamos abordar la compilación del AST de una expresión al set de instrucciones de la SECD. | ||
A continuación se presenta el esquema de compilación que permite hacer el paso del lenguaje original a listas de instrucciones. Note que solo es el paso a notación polaca inversa: | A continuación se presenta el esquema de compilación que permite hacer el paso del lenguaje original a listas de instrucciones. Note que solo es el paso a notación polaca inversa: | ||
Line 83: | Line 83: | ||
{< x 10}} {+ 2 3}}))) | {< x 10}} {+ 2 3}}))) | ||
(list | (list | ||
- | | ||
| | ||
+ | | ||
(ADD) | (ADD) | ||
- | | + | |
- | | + | |
</ | </ | ||
En el ejemplo anterior se puede notar que los tipos que entiende la máquina no se crean con los constructores de '' | En el ejemplo anterior se puede notar que los tipos que entiende la máquina no se crean con los constructores de '' | ||
Line 93: | Line 93: | ||
* '' | * '' | ||
* '' | * '' | ||
- | - Implemente la función '' | + | - (1.0) Implemente la función '' |
===== (0.5) Sistemas de Tipos Simple ===== | ===== (0.5) Sistemas de Tipos Simple ===== | ||
- | En la tarea anterior se abordó el chequeo de tipos en el lenguaje de predicados. En esta ocasión extenderemos | + | Se implementará |
- | - Extienda((Tome la función de la tarea anterior como punto de partida)) | + | - Implemente |
* 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 111: | Line 111: | ||
Implemente la función '' | Implemente la función '' | ||
- | * La existencia de '' | + | * La existencia de '' |
* En la definición de función, el cuerpo puede ser subtipo del tipo declarado de salida de la función | * En la definición de función, el cuerpo puede ser subtipo del tipo declarado de salida de la función | ||
* En la aplicación de función, el tipo del argumento puede ser subtipo del tipo declarado del argumento de la función. | * En la aplicación de función, el tipo del argumento puede ser subtipo del tipo declarado del argumento 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 #t) (BOOL_CONST #f) (AND) (CHECKCAST (MTNum))) | ||
- | </ | ||
- | - Implemente la función '' | ||
- | ==== Casts para funciones | + | ===== (1.0)Funciones con n-argumentos ===== |
- | El siguiente ejemplo no se puede ejecutar actualmente pues el sistema de tipos lo rechaza. <code scheme> | + | |
- | {with : Bool {id : (Any -> Any) | + | Actualmente su lenguaje soporta únicamente funciones con un único argumento. Extienda su lenguaje para que soporte funciones con n-argumentos. La gramática |
- | {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 | + | |
- | {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> | <code scheme> | ||
- | {with : Bool {id : (Any -> Any) | + | expr::=... |
- | {fun {x : Any} : Any x}} | + | | {fun {<id> : <TYPE>}* : <TYPE> <expr>} |
- | {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}}}}}} | + | |
- | </code> | + | |
- | 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 | + | |
- | </ | + |