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:2025-1:tarea1b [2025/04/07 19:04] – [Lenguaje con tipos estáticos] msegurteaching:cc4101:tareas:2025-1:tarea1b [2025/04/09 13:48] (current) – [Tarea 1b (Entrega: 20 de Abril de 2025)] dibanez
Line 1: Line 1:
-====== Tarea 1b (Entrega: TBD) ======+====== Tarea 1b (Entrega: 30 de Abril de 2025) ======
  
 ==== Lenguaje con tipos estáticos ==== ==== Lenguaje con tipos estáticos ====
Line 26: Line 26:
 </note> </note>
  
-===== Parte 1. Lenguaje con funciones de primer orden (1.5 ptos.===== +===== Parte 1. Lenguaje con funciones de primer orden [1.5 pts.===== 
  
-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) con scope léxico, y definiciones de funciones //top-level// de múltiples argumentos.
  
 La gramática BNF del lenguaje se  define a continuación: La gramática BNF del lenguaje se  define a continuación:
Line 37: Line 37:
    
 <expr>   ::= <num> <expr>   ::= <num>
-           | <sym>+           | <id>
            | <bool>            | <bool>
            | {cons <expr> <expr>}            | {cons <expr> <expr>}
Line 52: Line 52:
            | {if <expr> <expr> <expr>}            | {if <expr> <expr> <expr>}
            | {with {<binding>*} <expr>}            | {with {<binding>*} <expr>}
-           | {<sym> <expr>*}+           | {<id> <expr>*}
  
-<binding> ::= {<sym> <expr>}+<binding> ::= {<id> <expr>}
                        
 </code> </code>
Line 66: Line 66:
     (numV n)     (numV n)
     (boolV b)     (boolV b)
-    (pairV lv rV)+    (pairV lV rV)
 ) )
 </code>  </code> 
Line 188: Line 188:
 Teniendo en cuenta todo lo descrito anteriormente, implemente las siguientes funciones: Teniendo en cuenta todo lo descrito anteriormente, implemente las siguientes funciones:
  
-  - **[1.2 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.+  - **[1.2 pts]** ''interp :: Expr List[Fundef] Env -> Val or error'', que interpreta una expresión considerando una lista de funciones definidas al top-level.
   - **[0.3 pts]** ''run :: s-expr -> Val or error'', que toma un programa escrito en sintaxis concreta, lo parsea e interpreta.   - **[0.3 pts]** ''run :: s-expr -> Val or error'', que toma un programa escrito en sintaxis concreta, lo parsea e interpreta.
------+ 
 +----
  
 ===== Parte 2. Verificación estática de tipos (2.5 ptos.) =====  ===== Parte 2. Verificación estática de tipos (2.5 ptos.) ===== 
Line 285: Line 286:
   * Para ''%%with%%'' se verifica que todos los argumentos cumplan con el tipo declarado y el tipo resultante será el del cuerpo de la expresión. Si los identificadores no tienen tipo explícito, entonces se les asigna el de la expresión asociada.   * Para ''%%with%%'' se verifica que todos los argumentos cumplan con el tipo declarado y el tipo resultante será el del cuerpo de la expresión. Si los identificadores no tienen tipo explícito, entonces se les asigna el de la expresión asociada.
   * 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. El tipo resultante de una aplicación es 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. El tipo resultante de una aplicación es el tipo de retorno de la función aplicada.
 +  * Note que, cada expresión solo necesita ser checkeada una sola vez, incluso los cuerpos de las funciones.
  
 **Para los errores**: **Para los errores**:
Line 312: Line 314:
  
 ¿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? ¿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?
- 
-<del>El testing de esta parte recibe **0.5 pts**</del> -> se quita 
 ---- ----