Differences
This shows you the differences between two versions of the page.
Both sides previous revisionPrevious revisionNext revision | Previous revision | ||
teaching:cc4101:tareas:2021-1:tarea1 [2021/04/20 13:08] – etanter | teaching:cc4101:tareas:2021-1:tarea1 [2021/05/10 14:34] (current) – P3, add '}' on first example bortiz | ||
---|---|---|---|
Line 43: | Line 43: | ||
| {< | | {< | ||
| {if < | | {if < | ||
- | | {with { {<id> < | + | | {with {{< |
| {<id> < | | {<id> < | ||
Line 69: | Line 69: | ||
| | ||
{add2 {triple 2}} | {add2 {triple 2}} | ||
- | } | ||
- | |||
- | { ;; Programa de Ejemplo 4 | ||
- | | ||
- | | ||
- | | ||
- | #f}} | ||
- | | ||
} | } | ||
</ | </ | ||
Line 84: | Line 76: | ||
**Instrucciones importantes**: | **Instrucciones importantes**: | ||
* Para implementar el lenguaje, tiene que [[https:// | * Para implementar el lenguaje, tiene que [[https:// | ||
+ | * Tienen que verificar que los argumentos de los operadores booleanos sean booleanos (eso para alinear la verificación dinámica con la verificación estática que harán en la parte 2) | ||
* En caso de programas con errores dinámicos, su interprete tiene que reportarlos explícitamente. Por ejemplo: | * En caso de programas con errores dinámicos, su interprete tiene que reportarlos explícitamente. Por ejemplo: | ||
Line 89: | Line 82: | ||
debe caerse en tiempo de ejecución con un error (se levantan con '' | debe caerse en tiempo de ejecución con un error (se levantan con '' | ||
<code scheme>" | <code scheme>" | ||
+ | Recuerde que puede testear estos errores con '' | ||
Line 126: | Line 120: | ||
{id 5}} | {id 5}} | ||
- | {{define {add1 {x : Num}} {+ x 1}} | + | {{define {add2 {x : Num}} {+ x 2}} |
{with {{oops #f}} | {with {{oops #f}} | ||
- | {add1 oops}}} | + | {add2 oops}}} |
</ | </ | ||
- | En particular, fíjese que el último ejemplo está bien tipado solamente porque se usa '' | + | En particular, fíjese que el último ejemplo está bien tipado solamente porque se usa '' |
En esta parte, deben definir una nueva función '' | En esta parte, deben definir una nueva función '' | ||
Line 139: | Line 133: | ||
* 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 cual). | * 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 cual). | ||
* 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. Recuerde que si no se especifica un tipo, se considera '' | * 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. Recuerde que si no se especifica un tipo, se considera '' | ||
- | * Deben 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 la sentencia | + | * Para una expresión |
* Para '' | * Para '' | ||
- | * En la aplicación de función se valida que: | + | * En la aplicación de función se valida que el número de argumentos coincide, y que el tipo de los argumentos |
- | - El número de argumentos coincide | + | |
- | - El tipo de los argumentos | + | |
Para los errores: | Para los errores: | ||
- | * Los errores de identificadores libres se tienen que detectar estáticamente, | + | * Los errores de identificadores libres |
- | * Los mensaje | + | * Los mensajes |
<code scheme>" | <code scheme>" | ||
Line 155: | Line 147: | ||
> (typecheck '{3}) | > (typecheck '{3}) | ||
' | ' | ||
- | > (typecheck ' | + | > (typecheck ' |
- | {false {> 3 4}}}) | + | {f {> 3 4}}}) |
- | 'Bool </ | + | 'Any </ |
> (typecheck ' | > (typecheck ' | ||
{one #t}}) | {one #t}}) | ||
" | " | ||
- | > (typecheck '{> 10 #t}) | + | > (typecheck '{{> 10 #t}}) |
" | " | ||
- | > (typecheck '{if 73 #t #t}) | + | > (typecheck '{{if 73 #t #t}}) |
" | " | ||
- | > (typecheck '{with {{x 5} {y : Num #t} {z 42}} | + | > (typecheck '{{with {{x 5} {y : Num #t} {z 42}} |
- | z}) | + | z}}) |
" | " | ||
+ | |||
+ | ¿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? | ||
---- | ---- | ||
===== Parte 3. Contratos en funciones de primer orden (2.0 pt) ===== | ===== Parte 3. Contratos en funciones de primer orden (2.0 pt) ===== | ||
- | Tomando como base el lenguaje generado en el ítem anterior, se procede | + | Ahora vamos a añadir verificación dinámica mediante contratos |
<code scheme> | <code scheme> | ||
< | < | ||
Line 178: | Line 172: | ||
| {<id> [: < | | {<id> [: < | ||
</ | </ | ||
- | Un contrato corresponde a un predicado, una función que reciba exactamente | + | Un contrato corresponde a un predicado, una función que reciba exactamente un argumento y retorne un booleano. Un ejemplo de programa válido puede ser: |
<code scheme> | <code scheme> | ||
{{define {positive x} : Bool {> x 0}} | {{define {positive x} : Bool {> x 0}} | ||
Line 211: | Line 205: | ||
| | ||
| | ||
- | | + | |
{/ {* y y} x}} | {/ {* y y} x}} | ||
{calc 25 3}} | {calc 25 3}} |