Differences
This shows you the differences between two versions of the page.
Both sides previous revisionPrevious revisionNext revision | Previous revision | ||
teaching:cc4101:tareas:2022-1:tarea1 [2022/04/06 16:13] – [Parte 3. Contratos en funciones de primer orden (2.0 pt)] tdiaz | teaching:cc4101:tareas:2022-1:tarea1 [2022/04/19 18:54] (current) – etanter | ||
---|---|---|---|
Line 1: | Line 1: | ||
- | ====== Tarea 1 (Entrega: | + | ====== Tarea 1 (Entrega: |
==== Tipos estáticos y contratos ==== | ==== Tipos estáticos y contratos ==== | ||
Line 20: | Line 20: | ||
<note important> | <note important> | ||
- | Cada parte de esta tarea vale lo mismo: 2 puntos. | + | La asignación de puntaje, de cada pregunta, |
* 0.2 para soportar la sintaxis indicada (parser bien definido y estructurado) | * 0.2 para soportar la sintaxis indicada (parser bien definido y estructurado) | ||
- | * 1.5 para las funcionalidades (p.ej. intérprete para la P1) | ||
* 0.3 para testing (cobertura de todos los casos relevantes) | * 0.3 para testing (cobertura de todos los casos relevantes) | ||
+ | * Puntaje restante para las funcionalidades (p.ej. intérprete para la P1) | ||
</ | </ | ||
- | ===== Parte 1. Lenguaje con funciones de primer orden ===== | + | ===== Parte 1. Lenguaje con funciones de primer orden (2.0 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 55: | Line 55: | ||
{ ;; Programa de Ejemplo 1 | { ;; Programa de Ejemplo 1 | ||
| | ||
- | | + | |
{with {{x 9} {y {cons 1 {cons 3 4}}}} | {with {{x 9} {y {cons 1 {cons 3 4}}}} | ||
- | {sum x {fst y} {second-first | + | {sum x {fst y} {cadr y}} } |
} | } | ||
{ ;; Programa de Ejemplo 2 | { ;; Programa de Ejemplo 2 | ||
Line 64: | Line 64: | ||
} | } | ||
{ ;; Programa de Ejemplo 3 | { ;; Programa de Ejemplo 3 | ||
- | | + | |
| | ||
{add2 {triple 2}} | {add2 {triple 2}} | ||
Line 93: | Line 93: | ||
----- | ----- | ||
- | ===== Parte 2. Verificación estática de tipos ===== | + | ===== 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 | ||
Line 111: | Line 111: | ||
</ | </ | ||
- | En el BNF utilizamos '' | + | En el BNF utilizamos '' |
Los programas siguientes están bien tipados: | Los programas siguientes están bien tipados: | ||
<code scheme> | <code scheme> | ||
- | {{with {{x : Num 5} {y : Num 10}} {+ x y}}} | + | { ; Programa de ejemplo 1 |
+ | | ||
+ | | ||
+ | } | ||
- | {{with {{x 5}} | + | { ; Programa de ejemplo 2 |
- | {with {{y : Num {+ x 1}}} {+ x y}}} | + | |
+ | {with {{y : Num {+ x 1}}} | ||
+ | | ||
+ | } | ||
- | {{define {add-pair {p : {Pair Num Num}} {x : Num}} : {Pair Num Num} {cons (+ (fst p) x) (+ (snd p) x)}} | + | { ; Programa de ejemplo 3 |
- | | + | |
+ | | ||
+ | {add-pair {cons 1 1} 1} | ||
+ | } | ||
- | {{define {id {x : Num}} x} | + | { ; Programa de ejemplo 4 |
- | {id 5}} | + | |
+ | {id 5} | ||
+ | } | ||
+ | |||
+ | { ; Programa de ejemplo 5 | ||
+ | {define {sum {x : Num} {y : Num} {z : Num}} | ||
+ | {+ x {+ y z}}} | ||
+ | {define {cadr {x : {Pair Num {Pair Num Num}}}} : Num | ||
+ | {fst {snd x}}} | ||
+ | {with {{x 9} {y {cons 1 {cons 3 4}}}} | ||
+ | {sum x {fst y} {cadr y}} } | ||
+ | } | ||
</ | </ | ||
Line 131: | Line 151: | ||
En esta parte, deben definir una nueva función '' | En esta parte, deben definir una nueva función '' | ||
- | **Instrucciones**: | + | **Observaciones importantes**: |
* Recuerden que la gramática BNF dicta la estructura de sus definiciones | * Recuerden que la gramática BNF dicta la estructura de sus definiciones | ||
* La verificación de tipos de un programa consiste en verificar que todas las definiciones de función estén bien tipadas, y que la última expresión tiene un tipo (no importa cuál). | * La verificación de tipos de un programa consiste en verificar que todas las definiciones de función estén bien tipadas, y que la última expresión tiene un tipo (no importa cuál). | ||
Line 138: | Line 158: | ||
* Para '' | * Para '' | ||
* 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. La aplicación en sí tiene el tipo de retorno 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. La aplicación en sí tiene el tipo de retorno de la función aplicada. | ||
Line 168: | Line 188: | ||
---- | ---- | ||
- | ===== Parte 3. Contratos en funciones de primer orden (1.5 pt) ===== | + | ===== Parte 3. Contratos en funciones de primer orden (1.5 ptos.) ===== |
Ahora vamos a 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: | Ahora vamos a 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> | <code scheme> | ||
- | < | + | < |
< | < | ||
| {<id> : < | | {<id> : < | ||
Line 177: | Line 197: | ||
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}} : Bool {< 0 x}} | + | {{define {positive {x : Num}} {< 0 x}} |
| | ||
{+ y -x}} | {+ y -x}} | ||
Line 187: | Line 207: | ||
En esta parte, su función '' | En esta parte, su función '' | ||
- | **Instrucciones**: | + | **Observaciones importantes**: |
* En el intérprete, | * En el intérprete, | ||
* Cuando el contrato no se cumpla, el patrón de error es: <code scheme> | * Cuando el contrato no se cumpla, el patrón de error es: <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 '' | + | * Una función usada como contrato |
" | " | ||
</ | </ | ||
Line 198: | Line 218: | ||
Más ejemplos: | Más ejemplos: | ||
<code scheme> | <code scheme> | ||
- | {{define {positive {x : Num}} : Bool {< 0 x}} | + | {{define {positive {x : Num}} {< 0 x}} |
- | | + | |
| | ||
</ | </ | ||
<code scheme> | <code scheme> | ||
- | {{define {pair-lt100? | + | {{define {pair-lt100? |
- | | + | |
{< 200 {sum-pair {cons 80 50}}}} | {< 200 {sum-pair {cons 80 50}}}} | ||
</ | </ | ||
Line 211: | Line 231: | ||
<code scheme> | <code scheme> | ||
- | > (run ' | + | > (run ' |
- | | + | |
#t} | #t} | ||
| |