[[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.