Differences
This shows you the differences between two versions of the page.
Both sides previous revisionPrevious revisionNext revision | Previous revision | ||
teaching:cc4101:tareas:xyz:tarea1b [2024/04/08 15:20] – [Parte 3. Contratos en funciones de primer orden (por definir)] gricci | teaching:cc4101:tareas:xyz:tarea1b [2024/04/30 18:08] (current) – gricci | ||
---|---|---|---|
Line 1: | Line 1: | ||
- | ====== Tarea 1b (Entrega: | + | ====== Tarea 1b (Entrega: |
==== Lenguaje con tipos estáticos ==== | ==== Lenguaje con tipos estáticos ==== | ||
Line 5: | Line 5: | ||
Ya se habrán dado cuenta que ciertos lenguajes tienen tipos estáticos (C/C++, Java, C#, Scala, etc.) y otros tienen tipos dinámicos (Python, Racket, JavaScript, etc.). | Ya se habrán dado cuenta que ciertos lenguajes tienen tipos estáticos (C/C++, Java, C#, Scala, etc.) y otros tienen tipos dinámicos (Python, Racket, JavaScript, etc.). | ||
- | En esta tarea van a implementar un lenguaje simple con funciones de primer orden, tipos de datos básicos y pares. Para implementar este lenguaje necesitaremos un parser (lo implementamos en la tarea 1a), y un interprete, dividiremos el desarrollo de esta tarea en dos partes (más una opcional). Primero, el lenguaje contará sólo con chequeo dinámico de tipos (parte 1), para luego agregar verificación de tipos estáticos (parte 2). Opcionalmente (como bonus), puede agregar contratos dinámicos para funciones (parte 3). | + | En esta tarea van a implementar un lenguaje simple con funciones de primer orden, tipos de datos básicos y pares. Para implementar este lenguaje necesitaremos un parser (lo implementamos en la tarea 1a), y un intérprete, dividiremos el desarrollo de esta tarea en dos partes (más una opcional). Primero, el lenguaje contará sólo con chequeo dinámico de tipos (parte 1), para luego agregar verificación de tipos estáticos (parte 2). Opcionalmente (como bonus), puede agregar contratos dinámicos para funciones (parte 3). |
---- | ---- | ||
Line 14: | Line 14: | ||
</ | </ | ||
+ | **Distribución de Puntaje** | ||
- | Deben entregar via U-cursos | + | Esta tarea tiene **4 pts** en total, |
+ | * 3 pts por implementación (subdividido como especifica el enunciado). | ||
+ | * 0.5 pts para testing. | ||
+ | * 0.5 pts para calidad de código. | ||
- | Si lo desea, puede obtener un bonus resolviendo la tercera parte, que es opcional: '' | + | Deben entregar via U-cursos **un archivo .zip** que contenga los siguientes archivos: '' |
+ | |||
+ | Si lo desea, puede obtener un bonus resolviendo la tercera parte, que es opcional: '' | ||
+ | |||
+ | **Nota:** Es libre de implementar el intérprete usando sustitución inmediata o diferida (con ambientes), en cuyo caso podría serle útil el archivo {{ : | ||
Deben entregar vía U-Cursos **un único archivo .zip** que contenga todos los archivos de su entrega. | Deben entregar vía U-Cursos **un único archivo .zip** que contenga todos los archivos de su entrega. | ||
<note important> | <note important> | ||
- | * Recuerde incluir tests con cobertura de todos los casos relevantes para todas las funciones que implemente, pues esto se considerará en la evaluación. | + | * Recuerde incluir tests con cobertura de todos los casos relevantes para todas las funciones que implemente |
</ | </ | ||
- | ===== Parte 1. Lenguaje con funciones de primer orden (1.5 ptos.) ===== | + | |
+ | ===== Parte 1. Lenguaje con funciones de primer orden (1.1 ptos.) ===== | ||
En esta parte, vamos a implementar un lenguaje que incluye primitivas útiles (números, booleanos, pares, y operadores simples), identificadores locales ('' | En esta parte, vamos a implementar un lenguaje que incluye primitivas útiles (números, booleanos, pares, y operadores simples), identificadores locales ('' | ||
Line 52: | Line 61: | ||
| {<id> < | | {<id> < | ||
- | < | + | < |
</ | </ | ||
Line 111: | Line 120: | ||
} | } | ||
</ | </ | ||
+ | Además de lo anterior, asumiremos por simplicidad que en los bindings de un mismo '' | ||
+ | <code scheme> | ||
+ | { | ||
+ | {with {{x 2} | ||
+ | {x 4}} | ||
+ | x} | ||
+ | } | ||
+ | </ | ||
* Debe verificar en tiempo de ejecución que los argumentos de los operadores numéricos sean numéricos, que los argumentos de los operadores booleanos sean booleanos, y que los argumentos de los operadores de pares sean pares (En la parte 2 se alineará la verificación dinámica con la verificación estática). | * Debe verificar en tiempo de ejecución que los argumentos de los operadores numéricos sean numéricos, que los argumentos de los operadores booleanos sean booleanos, y que los argumentos de los operadores de pares sean pares (En la parte 2 se alineará la verificación dinámica con la verificación estática). | ||
* Considere que la igualdad solo es válida sobre números. | * Considere que la igualdad solo es válida sobre números. | ||
Line 172: | Line 189: | ||
Teniendo en cuenta todo lo descrito anteriormente, | Teniendo en cuenta todo lo descrito anteriormente, | ||
- | - **[0 pts]** '' | + | - **[0.9 pts]** '' |
- | - **[0 pts]** '' | + | - **[0.2 pts]** '' |
----- | ----- | ||
- | ===== Parte 2. Verificación estática de tipos (2.5 ptos.) ===== | + | |
+ | ===== Parte 2. Verificación estática de tipos (1.9 ptos.) ===== | ||
En esta parte vamos a extender el lenguaje con anotaciones de tipos y verificación estática de ellos. Las diferencias en la sintaxis del lenguaje respecto de la parte anterior son: | En esta parte vamos a extender el lenguaje con anotaciones de tipos y verificación estática de ellos. Las diferencias en la sintaxis del lenguaje respecto de la parte anterior son: | ||
Line 186: | Line 204: | ||
;; < | ;; < | ||
- | < | + | < |
< | < | ||
Line 205: | Line 223: | ||
{+ x y}} | {+ x y}} | ||
} | } | ||
+ | </ | ||
+ | <code scheme> | ||
{ | { | ||
{with {{x 5}} | {with {{x 5}} | ||
Line 211: | Line 230: | ||
{+ x y}} | {+ x y}} | ||
} | } | ||
+ | </ | ||
+ | <code scheme> | ||
{ | { | ||
{define {add-pair {p : {Pair Num Num}} {x : Num}} : {Pair Num Num} | {define {add-pair {p : {Pair Num Num}} {x : Num}} : {Pair Num Num} | ||
Line 217: | Line 237: | ||
{add-pair {cons 1 1} 1} | {add-pair {cons 1 1} 1} | ||
} | } | ||
+ | </ | ||
+ | <code scheme> | ||
{ | { | ||
{define {id {x : Num}} : Num x} | {define {id {x : Num}} : Num x} | ||
{id 5} | {id 5} | ||
} | } | ||
+ | </ | ||
+ | <code scheme> | ||
{ | { | ||
{define {sum {x : Num} {y : Num} {z : Num}} : Num | {define {sum {x : Num} {y : Num} {z : Num}} : Num | ||
Line 232: | Line 254: | ||
{sum x {fst y} {cadr y}} } | {sum x {fst y} {cadr y}} } | ||
} | } | ||
- | |||
</ | </ | ||
Line 238: | Line 259: | ||
Note que se agregó el nodo ''< | Note que se agregó el nodo ''< | ||
- | - **[0.0 pts]** Defina el tipo de datos '' | + | - **[0.1 pts]** Defina el tipo de datos '' |
- | - **[0.0 pts]** Implemente la función '' | + | - **[0.2 pts]** Implemente la función '' |
- | - **[0.0 pts]** Modifique la función '' | + | - **[0.1 pts]** Modifique la función '' |
Además de lo anterior, observe que el nodo ''< | Además de lo anterior, observe que el nodo ''< | ||
- | - **[0.0 pts]** Modifique el tipo de datos '' | + | - **[0.1 pts]** Modifique el tipo de datos '' |
- | - **[0.0 pts]** Modifique la función '' | + | - **[0.1 pts]** Modifique la función '' |
Line 251: | Line 272: | ||
Para poder realizar un checkeo de tipos estático, necesitaremos: | Para poder realizar un checkeo de tipos estático, necesitaremos: | ||
- | - **[0.0 pts]** Implementar la función '' | + | - **[0.6 pts]** Implementar la función '' |
- | - **[0.0 pts]** Implementar '' | + | - **[0.4 pts]** Implementar '' |
- | - **[0.0 pts]** Implementar '' | + | - **[0.2 pts]** Implementar '' |
- | - **[0.0 pts]** Extender la función '' | + | - **[0.1 pts]** Extender la función '' |
Line 268: | Line 289: | ||
**Para los errores**: | **Para los errores**: | ||
- | * Los errores de identificadores libres | + | * Los errores de identificadores libres, funciones no definidas |
* Los mensajes de error de tipo detectados estáticamente tienen que seguir el siguiente patrón: | * Los mensajes de error de tipo detectados estáticamente tienen que seguir el siguiente patrón: | ||
<code scheme>" | <code scheme>" | ||
Line 299: | Line 320: | ||
<note important> | <note important> | ||
- | Esta parte es de realización **opcional**. Si la desarrolla correctamente obtendrá un bono de **1 pt** que podrán agregar a la nota de cualquiera de las tareas. | + | Esta parte es de realización **opcional**. Si la desarrolla correctamente obtendrá un bono de **1 pt** que podrán agregar a la nota de cualquiera de las tareas. |
</ | </ | ||
Line 312: | Line 333: | ||
Un contrato corresponde a un predicado, una función que recibe exactamente un argumento y retorna un booleano. Un ejemplo de programa válido puede ser: | Un contrato corresponde a un predicado, una función que recibe exactamente un argumento y retorna un booleano. Un ejemplo de programa válido puede ser: | ||
<code scheme> | <code scheme> | ||
- | {{define {positive {x : Num}} {< 0 x}} | + | {{define {positive {x : Num}} : Bool {< 0 x}} |
| | ||
{- y x}} | {- y x}} | ||
Line 352: | Line 373: | ||
" | " | ||
</ | </ | ||
+ |