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:xyz:tarea1b [2024/04/08 17:19] – [Lenguaje con tipos estáticos] gricciteaching:cc4101:tareas:xyz:tarea1b [2024/04/30 18:08] (current) gricci
Line 1: Line 1:
-====== Tarea 1b (Entrega: Jueves 18 de Abril de 2023 - fecha por confirmar) ======+====== Tarea 1b (Entrega: Domingo 21 de Abril de 2024) ======
  
 ==== Lenguaje con tipos estáticos ==== ==== Lenguaje con tipos estáticos ====
Line 13: Line 13:
 Recuerden que tienen que seguir la metodología [[https://users.dcc.uchile.cl/~etanter/preplai/defun.html|vista en las primeras clases]] y dejar sus funciones debidamente documentadas. Recuerden que tienen que seguir la metodología [[https://users.dcc.uchile.cl/~etanter/preplai/defun.html|vista en las primeras clases]] y dejar sus funciones debidamente documentadas.
 </note> </note>
 +
 +**Distribución de Puntaje**
 +
 +Esta tarea tiene **4 pts** en total, que se dividen de la siguiente manera:
 +  * 3 pts por implementación (subdividido como especifica el enunciado).
 +  * 0.5 pts para testing.
 +  * 0.5 pts para calidad de código.
  
 Deben entregar via U-cursos **un archivo .zip** que contenga los siguientes archivos: ''{{ :teaching:cc4101:tareas:2024-1:tarea1b:p1.rkt |p1.rkt}}'', ''{{ :teaching:cc4101:tareas:2024-1:tarea1b:p1-test.rkt |p1-test.rkt}}'', ''{{ :teaching:cc4101:tareas:2024-1:tarea1b:p2.rkt |p2.rkt}}'', ''{{ :teaching:cc4101:tareas:2024-1:tarea1b:p2-test.rkt |p2-test.rkt}}'', archivos que deberán contener las funcionalidades solicitadas en cada pregunta y los tests respectivos. Deben entregar via U-cursos **un archivo .zip** que contenga los siguientes archivos: ''{{ :teaching:cc4101:tareas:2024-1:tarea1b:p1.rkt |p1.rkt}}'', ''{{ :teaching:cc4101:tareas:2024-1:tarea1b:p1-test.rkt |p1-test.rkt}}'', ''{{ :teaching:cc4101:tareas:2024-1:tarea1b:p2.rkt |p2.rkt}}'', ''{{ :teaching:cc4101:tareas:2024-1:tarea1b:p2-test.rkt |p2-test.rkt}}'', archivos que deberán contener las funcionalidades solicitadas en cada pregunta y los tests respectivos.
  
 Si lo desea, puede obtener un bonus resolviendo la tercera parte, que es opcional: ''{{ :teaching:cc4101:tareas:2024-1:tarea1b:p3.rkt |p3.rkt}}'' y ''{{ :teaching:cc4101:tareas:2024-1:tarea1b:p3-test.rkt |p3-test.rkt}}''. Más detalles al final del documento. Si lo desea, puede obtener un bonus resolviendo la tercera parte, que es opcional: ''{{ :teaching:cc4101:tareas:2024-1:tarea1b:p3.rkt |p3.rkt}}'' y ''{{ :teaching:cc4101:tareas:2024-1:tarea1b:p3-test.rkt |p3-test.rkt}}''. Más detalles al final del documento.
 +
 +**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 {{ :teaching:cc4101:tareas:2023-1:env.rkt |env.rkt}}
  
 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 23: Line 32:
   * Recuerde incluir tests con cobertura de todos los casos relevantes para todas las funciones que implemente y aquellas que extienda, pues esto se considerará en la evaluación.   * Recuerde incluir tests con cobertura de todos los casos relevantes para todas las funciones que implemente y aquellas que extienda, pues esto se considerará en la evaluación.
 </note> </note>
-===== Parte 1. Lenguaje con funciones de primer orden (1.ptos.) ===== + 
 +===== Parte 1. Lenguaje con funciones de primer orden (1.ptos.) ===== 
  
 En esta parte, vamos a implementar un lenguaje que incluye primitivas útiles (números, booleanos, pares, y operadores simples), identificadores locales (''with'' con una cantidad arbitraria de identificadores), y definiciones de funciones //top-level// de múltiples argumentos. En esta parte, vamos a implementar un lenguaje que incluye primitivas útiles (números, booleanos, pares, y operadores simples), identificadores locales (''with'' con una cantidad arbitraria de identificadores), y definiciones de funciones //top-level// de múltiples argumentos.
Line 51: Line 61:
            | {<id> <expr>*}            | {<id> <expr>*}
  
-<binding> ::= (<id> <expr>)+<binding> ::= {<id> <expr>}
                        
 </code> </code>
Line 110: Line 120:
   }   }
   </code>   </code>
 +Además de lo anterior, asumiremos por simplicidad que en los bindings de un mismo ''with'' no pueden haber repeticiones/reintroducciones de identificadores. **No es necesario que verifique este punto**, puede simplemente asumir que es parte del contrato. Por ejemplo, el comportamiento del siguiente programa estaría indefinido:
 +<code scheme>
 +  {
 +     {with {{x 2}
 +            {x 4}}
 +        x}
 +  }
 +</code>
   * 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 171: Line 189:
 Teniendo en cuenta todo lo descrito anteriormente, implemente las siguientes funciones: Teniendo en cuenta todo lo descrito anteriormente, implemente las siguientes funciones:
  
-  - **[1.0 pts]** ''interp :: Expr List[Fundef] -> Val or error'', que interpreta una expresión considerando una lista de funciones definidas al top-level.+  - **[0.9 pts]** ''interp :: Expr List[Fundef] -> Val or error'', que interpreta una expresión considerando una lista de funciones definidas al top-level. Si lo desea, puede implementar ''interp'' usando ambientes (sustitución diferida). Recuerde actualizar la firma de la función si elige dicha opción.
   - **[0.2 pts]** ''run :: s-expr -> Val or error'', que toma un programa escrito en sintaxis concreta, lo parsea e interpreta.   - **[0.2 pts]** ''run :: s-expr -> Val or error'', que toma un programa escrito en sintaxis concreta, lo parsea e interpreta.
- 
-El testing recibe **0.3 pts**. 
  
 ----- -----
-===== Parte 2. Verificación estática de tipos (2.ptos.) ===== + 
 +===== Parte 2. Verificación estática de tipos (1.ptos.) ===== 
  
 En esta parte vamos a extender el lenguaje 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 con anotaciones de tipos y verificación estática de ellos. Las diferencias en la sintaxis del lenguaje respecto de la parte anterior son:
Line 206: Line 223:
      {+ x y}}      {+ x y}}
 } }
 +</code> 
 +<code scheme>
 { {
   {with {{x 5}}   {with {{x 5}}
Line 212: Line 230:
         {+ x y}}         {+ x y}}
 } }
 +</code> 
 +<code scheme>
 { {
   {define {add-pair {p : {Pair Num Num}} {x : Num}} : {Pair Num Num}    {define {add-pair {p : {Pair Num Num}} {x : Num}} : {Pair Num Num} 
Line 218: Line 237:
   {add-pair {cons 1 1} 1}   {add-pair {cons 1 1} 1}
 } }
 +</code> 
 +<code scheme>
 { {
   {define {id {x : Num}} : Num x}   {define {id {x : Num}} : Num x}
   {id 5}   {id 5}
 } }
 +</code> 
 +<code scheme>
 { {
   {define {sum {x : Num} {y : Num} {z : Num}} : Num    {define {sum {x : Num} {y : Num} {z : Num}} : Num 
Line 233: Line 254:
      {sum x {fst y} {cadr y}} }      {sum x {fst y} {cadr y}} }
 } }
- 
 </code> </code>
  
Line 252: Line 272:
  
 Para poder realizar un checkeo de tipos estático, necesitaremos: Para poder realizar un checkeo de tipos estático, necesitaremos:
-  - **[0.pts]** Implementar la función ''typecheck-expr :: Exp -> Type or error'' que toma una expresión y retorna su tipoo lanza un error. +  - **[0.pts]** Implementar la función ''typecheck-expr :: Exp Env List[Fundef] -> Type or error'' que toma una expresión, un ambiente y una lista de definiciones de funciones, y retorna el tipo de la expresión o lanza un error. 
-  - **[0.4 pts]** Implementar ''typecheck-fundef :: Fundef -> Type or error'' que recibe una definición de función y retorna su tipo de retorno, o lanza un error.+  - **[0.4 pts]** Implementar ''typecheck-fundef :: Fundef List[Fundef] -> Type or error'' que recibe una definición de función y una lista de definiciones de funciones, y retorna el tipo de retorno de la función, o lanza un error.
   - **[0.2 pts]** Implementar ''typecheck :: Prog -> Type or error'' que toma un programa y nos retorna su tipo, o lanza un error.   - **[0.2 pts]** Implementar ''typecheck :: Prog -> Type or error'' que toma un programa y nos retorna su tipo, o lanza un error.
-  - **[0.1 pts]** Extender la función ''run'' para que verifique el tipo del programa (este paso puede fallar) antes de interpretarlo.+  - **[0.1 pts]** Extender la función ''run'' para que verifique el tipo del programa (este paso puede fallar) antes de interpretarlo. Note que tendrá que hacer pequeñas modificaciones a la función ''interp'' para que pueda procesar el nuevo AST con anotaciones de tipo. Unicamente los casos para el ''with'' y aplicaciones de función se verán afectados.
  
-El testing de esta parte recibe **0.5 pts**. 
  
 **Observaciones importantes**: **Observaciones importantes**:
Line 270: Line 289:
  
 **Para los errores**: **Para los errores**:
-  * Los errores de identificadores libres funciones no definidas deben detectarse estáticamente.+  * Los errores de identificadores libresfunciones no definidas y errores de aridad deben ahora detectarse estáticamente. El formato de los mensajes de error es el mismo que se especificó en la parte 1.
   * Los mensajes de error de tipo detectados estáticamente tienen que seguir el siguiente patrón:    * Los mensajes de error de tipo detectados estáticamente tienen que seguir el siguiente patrón: 
 <code scheme>"Static type error: expected T1 found T2"</code> donde ''T1'' es el tipo esperado y ''T2'' el tipo encontrado. <code scheme>"Static type error: expected T1 found T2"</code> donde ''T1'' es el tipo esperado y ''T2'' el tipo encontrado.
Line 301: Line 320:
  
 <note important> <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.+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. 
 </note> </note>
  
Line 314: Line 333:
 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}} {< 0 x}}+{{define {positive {x : Num}} : Bool {< 0 x}}
  {define {sub {x : Num @ positive} {y : Num}} : Num  {define {sub {x : Num @ positive} {y : Num}} : Num
            {- y x}}            {- y x}}
Line 354: Line 373:
 "Static contract error: invalid type for add" "Static contract error: invalid type for add"
 </code> </code>
 +