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:00] – [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 5: Line 5:
 Ya se habrán dado cuenta que ciertos lenguajes tienen tipos estáticos (C/C++, Java, C#, Scala, etc.) y otros tienen tipos dinámicos (Python, Racket, JavaScript, etc.). Ya se habrán dado cuenta que ciertos lenguajes tienen tipos estáticos (C/C++, Java, C#, Scala, etc.) y otros tienen tipos dinámicos (Python, Racket, JavaScript, etc.).
  
-En esta tarea van a implementar un lenguaje simple con funciones de primer orden, tipos de datos básicos y pares. Para implementar este lenguaje necesitaremos un parser (lo implementamos en la tarea 1a), y un intérprete, dividiremos el desarrollo de esta tarea en dos partes (más una opcional). Primero, el lenguaje contará sólo con chequeo dinámico de tipos (parte 1), para luego agregar verificación de tipos estáticos (parte 2). Opcionalmente (como bonus), puede agregar contratos dinámicos para funciones (parte 3). +En esta tarea van a implementar un lenguaje simple con funciones de primer orden (es decir, funciones cuya definición es separada de las expresiones normales del lenguaje), tipos de datos básicos y pares. Para implementar este lenguaje necesitaremos un parser (lo implementamos en la tarea 1a), y un intérprete (esta tarea). Dividiremos el desarrollo de esta tarea en dos partes (más una opcional). Primero, el lenguaje contará sólo con chequeo dinámico de tipos (parte 1), para luego agregar verificación de tipos estáticos (parte 2). Opcionalmente (como bonus), puede agregar contratos dinámicos para funciones (parte 3). 
  
 ---- ----
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 
 ---- ----