Differences
This shows you the differences between two versions of the page.
Both sides previous revisionPrevious revisionNext revision | Previous revision | ||
teaching:cc4101:tareas:tarea1xyz [2023/04/03 16:17] – [Tipos estáticos y contratos] rodrigo.urrea | teaching:cc4101:tareas:tarea1xyz [2023/04/05 21:02] (current) – etanter | ||
---|---|---|---|
Line 17: | Line 17: | ||
- | Deben entregar via U-cursos **un archivo .zip** que contenga los siguientes archivos: '' | + | Deben entregar via U-cursos **un archivo .zip** que contenga los siguientes archivos: '' |
Line 30: | Line 30: | ||
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 ('' | ||
- | Aquí está la gramática BNF del lenguaje: | + | La gramática BNF del lenguaje |
<code scheme> | <code scheme> | ||
< | < | ||
Line 55: | Line 55: | ||
</ | </ | ||
Un programa está compuesto de 0 o más definiciones de funciones, además de una expresión final que sirve de punto de entrada (como el //main// en C y Java). Una definición de función incluye el nombre de la función, el nombre de los parámetros formales, y finalmente la expresión del cuerpo de la función. Las expresiones '' | Un programa está compuesto de 0 o más definiciones de funciones, además de una expresión final que sirve de punto de entrada (como el //main// en C y Java). Una definición de función incluye el nombre de la función, el nombre de los parámetros formales, y finalmente la expresión del cuerpo de la función. Las expresiones '' | ||
+ | |||
+ | Los programas que terminan reducen a valores. Estos pueden ser números, booleanos o pares de valores. Siguiendo buenas prácticas, definimos un tipo de dato inductivo '' | ||
Algunos ejemplos de programas válidos para este lenguaje pueden ser: | Algunos ejemplos de programas válidos para este lenguaje pueden ser: | ||
Line 80: | Line 82: | ||
</ | </ | ||
- | En esta parte, su función '' | + | Su función '' |
+ | |||
+ | * Implemente la función '' | ||
+ | * Implemente la función '' | ||
**Observaciones importantes**: | **Observaciones importantes**: | ||
* Recuerde que la estructura del BNF dicta la estructura de las funciones que procesan los programas, definiciones, | * Recuerde que la estructura del BNF dicta la estructura de las funciones que procesan los programas, definiciones, | ||
- | * Para implementar el lenguaje, | + | * Al implementar el lenguaje, |
- | * La semántica debe considerar | + | * La semántica debe considerar |
- | * Tienen que verificar | + | * Verifique en tiempo de ejecución |
* Considere que la igualdad solo es válida sobre números. | * Considere que la igualdad solo es válida sobre números. | ||
- | * La condición de '' | + | * La condición de una expresión |
* En caso de programas con errores dinámicos, su intérprete tiene que reportarlos explícitamente. Por ejemplo: | * En caso de programas con errores dinámicos, su intérprete tiene que reportarlos explícitamente. Por ejemplo: | ||
<code scheme> | <code scheme> | ||
- | debe caerse | + | debe fallar |
<code scheme>" | <code scheme>" | ||
- | Recuerde que puede testear estos errores | + | Recuerde que puede verificar si un test lanza una excepción |
Line 100: | Line 105: | ||
===== Parte 2. Verificación estática de tipos (2.5 ptos.) ===== | ===== Parte 2. Verificación estática de tipos (2.5 ptos.) ===== | ||
En esta parte vamos a extender el lenguaje de la Parte 1 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 de la Parte 1 con anotaciones de tipos y verificación estática de ellos. Las diferencias en la sintaxis del lenguaje respecto de la parte anterior son: | ||
- | * las declaraciones de función incluyen anotaciones de tipos en cada uno de sus argumentos y también para el tipo de retorno | + | * Las declaraciones de función incluyen anotaciones de tipos en cada uno de sus argumentos y también para el tipo de retorno. |
- | * las expresiones '' | + | * Las expresiones '' |
La nueva sintaxis es la siguiente: | La nueva sintaxis es la siguiente: | ||
Line 107: | Line 112: | ||
;; < | ;; < | ||
- | < | + | < |
- | < | + | < |
< | < | ||
Line 154: | Line 159: | ||
- | En esta parte, deben definir | + | * Defina |
+ | * Extienda | ||
**Observaciones importantes**: | **Observaciones importantes**: | ||
Line 161: | Line 167: | ||
* Para una definición de función, se valida que la expresión del cuerpo tenga el mismo tipo que el tipo de retorno declarado, suponiendo que cada argumento tiene el tipo declarado. Si el tipo de retorno no se especifica, entonces se usa el tipo del cuerpo. | * Para una definición de función, se valida que la expresión del cuerpo tenga el mismo tipo que el tipo de retorno declarado, suponiendo que cada argumento tiene el tipo declarado. Si el tipo de retorno no se especifica, entonces se usa el tipo del cuerpo. | ||
* Debe definir los tipos de los operadores primitivos de manera exacta, p.ej. '' | * Debe definir los tipos de los operadores primitivos de manera exacta, p.ej. '' | ||
- | * Para '' | + | * Considere que la igualdad ('' |
* Para una expresión '' | * Para una expresión '' | ||
* Para '' | * Para '' | ||
- | * En la aplicación de función se valida que el número de argumentos coincide, y que el tipo de los argumentos coincide con los tipos esperados de la función aplicada. | + | * En la aplicación de función se valida que el número de argumentos coincide, y que el tipo de los argumentos coincide con los tipos esperados de la función aplicada. |
Para los errores: | Para los errores: | ||
- | * Los errores de identificadores libres (o funciones no definidas) | + | * Los errores de identificadores libres (o funciones no definidas). Este error debe detectarse |
* 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 174: | Line 180: | ||
< | < | ||
> (typecheck '{3}) | > (typecheck '{3}) | ||
- | (Num) </ | + | (numT) </ |
> (typecheck ' | > (typecheck ' | ||
{f {< 3 4}}}) | {f {< 3 4}}}) | ||
- | (Num) </ | + | (numT) </ |
> (typecheck ' | > (typecheck ' | ||
{one #t}}) | {one #t}}) | ||
Line 204: | Line 210: | ||
{{define {positive {x : Num}} {< 0 x}} | {{define {positive {x : Num}} {< 0 x}} | ||
| | ||
- | {+ y -x}} | + | |
{sub 5 3}} | {sub 5 3}} | ||
</ | </ | ||
- | Donde el '' | + | Donde el argumento |
- | En esta parte, | + | * Extienda nuevamente |
**Observaciones importantes**: | **Observaciones importantes**: | ||
- | * En el intérprete, | + | * En el intérprete, |
- | * Cuando el contrato no se cumpla, el patrón | + | * Cuando el contrato no se cumpla, |
" | " | ||
</ | </ | ||
- | * Una función usada como contrato **debe** aceptar un solo argumento de cualquier tipo válido y **debe** retornar un valor de tipo '' | + | * Una función usada como contrato **debe** aceptar un solo argumento de cualquier tipo válido y **debe** retornar un valor de tipo '' |
" | " | ||
</ | </ | ||
Line 224: | Line 230: | ||
<code scheme> | <code scheme> | ||
{{define {positive {x : Num}} {< 0 x}} | {{define {positive {x : Num}} {< 0 x}} | ||
- | | + | |
| | ||
</ | </ | ||
Line 240: | Line 246: | ||
> (run ' | > (run ' | ||
| | ||
- | #t} | ||
| | ||
" | " | ||
</ | </ |