[[teaching:cc4101:tareas:2026-1:tarea2|<< Volver]]
===== Parte BONUS. Modificadores de with (1.0 pto) =====
En esta parte agregarán el casteo opcional de la forma de evaluación de los binds del ''with'' en SL. La gramática de la parte 3 hace verboso crear funciones (o variables en general) con modificadores de tipos. Nótese en el siguiente ejemplo que lo que queremos obtener es una **expresión que se evalúa según call-by-name y que evalúe a una función**:
{with {by-name {fun {f : {Num -> Num}} -> {name {Num -> Num}} :
f}}
{with {foo {fun {x : Num} -> Num :
x}}
{by-name foo}}}
Modificaremos el 'with' para permitir agregar un modificador de tipo a las expresiones, facilitando el proceso. El siguiente ejemplo será equivalente a lo anterior:
'{with {foo name {fun {x : Num} -> Num :
x}}
foo}
Esto también nos permite crear expresiones simples del lenguaje con diferentes métodos de evaluación:
>(run-p-sl '{with {x name {printn 1}}
{+ x x}})
(result 2 '("1" "1"))
==== Modificación de la gramática y parser =====
Se modificará la gramática de la siguiente forma:
::=
| {+ }
| {if0 }
;ocupamos [] para denotar algo opcional (no se escriben los [])
| {with { [: ] } }
|
| { }
| {fun { : } -> : }
| {printn }
Ahora ''with'' admite un modificador opcional que cambiará el modificador de tipo de la expresión nombrada al símbolo.
* (0.1 ptos) Cambie la sintaxis de la estructura ''swith'' para que admita un modificador.
* (0.3 ptos) Modifique la función ''parse-sl'' para manejar los casos en que sí hay modificadore. En caso de no haber, puede usar ''#f'' como modificador por defecto. Recuerde manejar el caso ''value''.
* (0.3 ptos) Modifique el caso ''swith'' en la función ''type-ast'' para que cambie el modificador de la expresión nombrada.
* (0.3 ptos) Modifique el caso ''swith'' en la función ''transform'' para que se interprete de forma correcta la expresión nombrada.