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 [2015/10/17 23:40] – [(2.0)((Divididos en 1 para de ''%%deBruijn%%'' y 1 para''%%compile%%'')) Compilación] racruz | teaching:cc4101:tareas:2015-2:tarea3 [2016/03/25 18:42] (current) – old revision restored (2015/10/31 14:36) fmosso | ||
---|---|---|---|
Line 43: | Line 43: | ||
</ | </ | ||
Tome un tiempo para experimentar con la función '' | Tome un tiempo para experimentar con la función '' | ||
- | ==== (1.0) Índices De Bruijn ==== | + | ==== Índices De Bruijn ==== |
Una forma de eliminar nombres de variables o identificadores de una expresión, es usando índices De Bruijn. Anteriormente vimos que la máquina SECD trabaja solo con índices, por lo que en esta sección vamos a hacer el paso de identificadores a dichos números, usando indices De Bruijn((La explicación detallada de como funcionan se puede encontrar en la sección 3.5 del [[http:// | Una forma de eliminar nombres de variables o identificadores de una expresión, es usando índices De Bruijn. Anteriormente vimos que la máquina SECD trabaja solo con índices, por lo que en esta sección vamos a hacer el paso de identificadores a dichos números, usando indices De Bruijn((La explicación detallada de como funcionan se puede encontrar en la sección 3.5 del [[http:// | ||
- | - Implemente la función '' | + | - (1.0) Implemente la función '' |
> (deBruijn | > (deBruijn | ||
| | ||
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 el chequeo de tipos de una expresión en presencia de funciones de primera clase. | En la tarea anterior se abordó el chequeo de tipos en el lenguaje de predicados. En esta ocasión extenderemos el chequeo de tipos de una expresión en presencia de funciones de primera clase. | ||
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 160: | Line 160: | ||
- Actualice la función '' | - Actualice la función '' | ||
> (compile (parse '{cast Num (and #t #f)})) | > (compile (parse '{cast Num (and #t #f)})) | ||
- | (list (BOOL_CONST #t) (BOOL_CONST #f) (AND) (CHECKCAST (MTNum))) | + | (list (BOOL_CONST #f) (BOOL_CONST #t) (AND) (CHECKCAST (MTNum))) |
</ | </ | ||
- Implemente la función '' | - Implemente la función '' |