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] – [Checkeo Estático de Tipos] 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**: