Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revisionPrevious revision
Next revision
Previous revision
teaching:cc4101:tareas:tarea1xyz [2023/04/03 20:38] – Reformulacion de algunas frases tvallejosteaching: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: ''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í.
  
  
Line 55: Line 55:
 </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:
Line 80: Line 82:
 </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**:
Line 111: Line 112:
 ;; <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
  
Line 177: Line 180:
  <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}})
Line 207: Line 210:
 {{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}}+           {- 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.
Line 227: Line 230:
 <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}} {x}}
  {negate 23}}  {negate 23}}
 </code> </code>
Line 243: Line 246:
 > (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>