Differences
This shows you the differences between two versions of the page.
Both sides previous revisionPrevious revisionNext revision | Previous revision | ||
teaching:cc4101:tareas:2024-1:tarea1b [2024/04/08 17:32] – [Actualizando el AST y Parser] gricci | teaching:cc4101:tareas:2024-1:tarea1b [2025/04/08 22:09] (current) – [Tarea 1b (Entrega: Domingo 21 de Abril de 2024)] dibanez | ||
---|---|---|---|
Line 1: | Line 1: | ||
- | ====== Tarea 1b (Entrega: | + | ====== Tarea 1b (Entrega: |
==== Lenguaje con tipos estáticos ==== | ==== Lenguaje con tipos estáticos ==== | ||
Line 17: | Line 17: | ||
Si lo desea, puede obtener un bonus resolviendo la tercera parte, que es opcional: '' | 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. | ||
Line 52: | Line 54: | ||
| {<id> < | | {<id> < | ||
- | < | + | < |
</ | </ | ||
Line 111: | Line 113: | ||
} | } | ||
</ | </ | ||
+ | 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 182: | ||
Teniendo en cuenta todo lo descrito anteriormente, | Teniendo en cuenta todo lo descrito anteriormente, | ||
- | - **[1.0 pts]** '' | + | - **[1.0 pts]** '' |
- **[0.2 pts]** '' | - **[0.2 pts]** '' | ||
- | El testing recibe **0.3 pts**. | + | El testing recibe **0.3 pts** |
----- | ----- | ||
Line 257: | Line 266: | ||
Para poder realizar un checkeo de tipos estático, necesitaremos: | Para poder realizar un checkeo de tipos estático, necesitaremos: | ||
- | - **[0.7 pts]** Implementar la función '' | + | - **[0.7 pts]** Implementar la función '' |
- | - **[0.4 pts]** Implementar '' | + | - **[0.4 pts]** Implementar '' |
- **[0.2 pts]** Implementar '' | - **[0.2 pts]** Implementar '' | ||
- | - **[0.1 pts]** Extender la función '' | + | - **[0.1 pts]** Extender la función '' |
- | El testing de esta parte recibe **0.5 pts**. | ||
**Observaciones importantes**: | **Observaciones importantes**: | ||
Line 301: | Line 309: | ||
¿Puede efectivamente convencerse de que todo programa que pasa la verificación de tipo no se cae con un error de tipo durante la ejecución? | ¿Puede efectivamente convencerse de que todo programa que pasa la verificación de tipo no se cae con un error de tipo durante la ejecución? | ||
+ | El testing de esta parte recibe **0.5 pts** | ||
---- | ---- | ||
+ | |||
+ | ===== Parte 3. Contratos en funciones de primer orden (1 pt. de bonus) ===== | ||
+ | |||
+ | <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. | ||
+ | </ | ||
+ | |||
+ | El propósito de esta parte es añadir verificación dinámica mediante contratos a las funciones de nuestro lenguaje. El único cambio en la sintaxis del lenguaje se ve reflejado en la definición de funciones, donde ahora se puede definir además un contrato para cada argumento: | ||
+ | |||
+ | <code scheme> | ||
+ | < | ||
+ | < | ||
+ | | {<id> : < | ||
+ | </ | ||
+ | |||
+ | 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> | ||
+ | {{define {positive {x : Num}} : Bool {< 0 x}} | ||
+ | | ||
+ | {- y x}} | ||
+ | {sub 5 3}} | ||
+ | </ | ||
+ | Donde el argumento '' | ||
+ | |||
+ | * Extienda nuevamente su función '' | ||
+ | |||
+ | **Observaciones importantes**: | ||
+ | * En el intérprete, | ||
+ | * Cuando el contrato no se cumpla, se debe lanzar un error con el siguiente patrón: <code scheme> | ||
+ | " | ||
+ | </ | ||
+ | * Una función usada como contrato **debe** aceptar un solo argumento de cualquier tipo válido y **debe** retornar un valor de tipo '' | ||
+ | " | ||
+ | </ | ||
+ | |||
+ | Más ejemplos: | ||
+ | <code scheme> | ||
+ | {{define {positive {x : Num}} : Bool {< 0 x}} | ||
+ | | ||
+ | | ||
+ | </ | ||
+ | |||
+ | <code scheme> | ||
+ | {{define {pair-non-zero? | ||
+ | | ||
+ | {+ {pair-div {cons 30 5}} {pair-div {cons 60 0}}} | ||
+ | } | ||
+ | " | ||
+ | </ | ||
+ | |||
+ | |||
+ | <code scheme> | ||
+ | > (run ' | ||
+ | | ||
+ | | ||
+ | " | ||
+ | </ | ||