Both sides previous revisionPrevious revisionNext revision | Previous revision |
teaching:cc4101:tareas:tarea1xyz [2023/04/03 20:38] – Reformulacion de algunas frases tvallejos | teaching:cc4101:tareas:tarea1xyz [2023/04/05 21:02] (current) – etanter |
---|
| |
| |
Deben entregar via U-cursos **un archivo .zip** que contenga los siguientes archivos: ''p1.rkt'', ''p2.rkt'' y ''p3.rkt'', archivos que deberán contener las funcionalidades solicitadas en cada pregunta y los test respectivos. | Deben entregar via U-cursos **un archivo .zip** que contenga los siguientes archivos: ''p1.rkt'', ''p1-test.rkt'', ''p2.rkt'', ''p2-test.rkt'', ''p3.rkt'' y ''p3-test.rkt'', archivos que deberán contener las funcionalidades solicitadas en cada pregunta y los tests respectivos. Puede usar como base los archivos que se encuentra aquí. |
| |
| |
</code> | </code> |
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 ''fst'' y ''snd'' obtienen el primer y segundo elemento de un par, respectivamente (similar a ''car'' y ''cdr'' de Racket). Las demás expresiones siguen la presentación estándar vista en clases. | 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 ''fst'' y ''snd'' obtienen el primer y segundo elemento de un par, respectivamente (similar a ''car'' y ''cdr'' de Racket). Las demás expresiones siguen la presentación estándar vista en clases. |
| |
| 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 ''Val'' para los valores (provisto en el código fuente de la parte 1). |
| |
Algunos ejemplos de programas válidos para este lenguaje pueden ser: | Algunos ejemplos de programas válidos para este lenguaje pueden ser: |
</code> | </code> |
| |
Su función ''run'' debe ser capaz de recibir un programa en sintaxis concreta e interpretarlo. | Su función ''run'' debe ser capaz de recibir un programa en sintaxis concreta e interpretarlo para producir un valor. |
| |
* Implemente la función ''parse :: s-Prog -> Prog'' | * Implemente la función ''parse :: s-Prog -> Prog'' |
* Implemente la función ''interp :: Expr -> Env -> list Fundef'' | * Implemente la función ''interp :: Expr -> Env -> list Fundef -> Val'' |
* Implemente la funcion ''run'' | |
| |
**Observaciones importantes**: | **Observaciones importantes**: |
;; <prog> no cambia | ;; <prog> no cambia |
| |
<fundef> ::= {define {<id> {<id> : <type>}*} [: <type>] <expr>} | <fundef> ::= {define {<id> {arg}*} [: <type>] <expr>} |
| |
| <arg> ::= {<id> : <type>} |
| |
<expr> ::= ... | {with { {<id> [: <type>] <expr>}* } <expr>} ; los otros casos no cambian | <expr> ::= ... | {with { {<id> [: <type>] <expr>}* } <expr>} ; los otros casos no cambian |
| |
<code scheme> | <code scheme> |
> (typecheck '{3}) | > (typecheck '{3}) |
(Num) </code> <code scheme> | (numT) </code> <code scheme> |
> (typecheck '{{define {f {p : Bool}} {if p 23 42}} | > (typecheck '{{define {f {p : Bool}} {if p 23 42}} |
{f {< 3 4}}}) | {f {< 3 4}}}) |
(Num) </code> <code scheme> | (numT) </code> <code scheme> |
> (typecheck '{{define {one {x : Num}} 1} | > (typecheck '{{define {one {x : Num}} 1} |
{one #t}}) | {one #t}}) |
{{define {positive {x : Num}} {< 0 x}} | {{define {positive {x : Num}} {< 0 x}} |
{define {sub {x : Num @ positive} {y : Num}} : Num | {define {sub {x : Num @ positive} {y : Num}} : Num |
{+ y -x}} | {- y x}} |
{sub 5 3}} | {sub 5 3}} |
</code> | </code> |
Donde el ''x'' posee como contrato la función ''positive'', que comprueba en tiempo de ejecución que ''x'' sea mayor que 0. | Donde el argumento ''x'' posee como contrato la función ''positive'', que comprueba en tiempo de ejecución que ''x'' sea mayor que 0. |
| |
| |
En esta parte, su función ''run'' debe hacer lo mismo que en la parte 2. Solamente que la interpretación ahora incluye verificar contratos. | * Extienda nuevamente su función ''run'' para que verifique los contratos en tiempo de ejecución. |
| |
**Observaciones importantes**: | **Observaciones importantes**: |
* En el intérprete, cuando se efectúa una aplicación de función, se tiene que verificar que sus argumentos cumplan con los contratos declarados (de existir -- sino, procede como antes). | * En el intérprete, cuando se efectúa una aplicación de función, se debe que verificar que los argumentos cumplan con los contratos declarados (en caso de que existan). |
* Cuando el contrato no se cumpla, el patrón de error es: <code scheme> | * Cuando el contrato no se cumpla, se debe lanzar un error con el siguiente patrón: <code scheme> |
"Runtime contract error: <v> does not satisfy <contract>" | "Runtime contract error: <v> does not satisfy <contract>" |
</code> donde ''<v>'' es el valor al que se le aplicó el contrato <contract> el nombre de este. | </code> donde ''<v>'' es el valor al que se le aplicó el contrato <contract> el nombre de este. |
* Una función usada como contrato **debe** aceptar un solo argumento de cualquier tipo válido y **debe** retornar un valor de tipo ''Bool''. Sino, 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 ''Bool''. En caso de no cumplir esta condición se debe lanzar un error con el siguiente patrón: <code scheme> |
"Static contract error: invalid type for <c>" | "Static contract error: invalid type for <c>" |
</code> donde ''<c>'' es el nombre del contrato que no tipa. | </code> donde ''<c>'' es el nombre del contrato que no tipa. |
<code scheme> | <code scheme> |
{{define {positive {x : Num}} {< 0 x}} | {{define {positive {x : Num}} {< 0 x}} |
{define {negate {x : Num @ positive}} -x} | {define {negate {x : Num @ positive}} {- 0 x}} |
{negate 23}} | {negate 23}} |
</code> | </code> |
> (run '{{define {add {x : Num} {y : Num}} {+ x y}} | > (run '{{define {add {x : Num} {y : Num}} {+ x y}} |
{define {oh-no {x : Num @ add}} x} | {define {oh-no {x : Num @ add}} x} |
#t} | |
{oh-no 21 21}}) | {oh-no 21 21}}) |
"Static contract error: invalid type for add" | "Static contract error: invalid type for add" |
</code> | </code> |