| Both sides previous revisionPrevious revisionNext revision | Previous revision |
| teaching:cc4101:tareas:2026-1:tarea2:bonus [2026/05/11 16:15] – [Modificación de la gramática y parser] msegur | teaching:cc4101:tareas:2026-1:tarea2:bonus [2026/05/11 18:08] (current) – [Modificación de la gramática y parser] mod a mtype bduarte |
|---|
| [[teaching:cc4101:tareas:2026-1:tarea2|<< Volver]] | [[teaching:cc4101:tareas:2026-1:tarea2|<< Volver]] |
| |
| ===== Parte BONUS. Casteo de evaluación (0.7 ptos) ===== | ===== 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**: | En el lenguaje SL, el único lugar donde se puede especificar una estrategia de evaluación es en la firma de una función anónima. Como hemos visto, las funciones anónimas también son en esencia la forma de introducir una variable local (recuerde como se puede considerar que ''with'' es azucar sintactico para una aplicación de lambda). En esta parte bonus, se pide extender la sintaxis del ''with'' para que permita especificar la estrategia de evaluación de la expresión nombrada. |
| |
| <code scheme> | Por ejemplo: |
| {with {by-name {fun {f : {Num -> Num}} -> {name {Num -> Num}} : | |
| f}} | |
| {with {foo {fun {x : Num} -> Num : | |
| x}} | |
| {by-name foo}}} | |
| </code> | |
| | |
| Modificaremos el 'with' para permitir agregar un modificador de tipo a las expresiones, facilitando el proceso. El siguiente ejemplo será equivalente a lo anterior: | |
| |
| <code scheme> | <code scheme> |
| '{with {foo name {fun {x : Num} -> Num : | {with {x : {name Num} {printn 10}} |
| x}} | {+ x x}} |
| foo} | |
| </code> | </code> |
| |
| Esto también nos permite crear expresiones simples del lenguaje con diferentes métodos de evaluación: | enlaza ''x'' con la promesa de evaluar ''{printn 10}'' cada vez que sea necesario. En este ejemplo, se debe imprimir ''10'' dos veces, y producir ''20''. |
| |
| <code scheme> | <note tip>Noten en particular que la sintaxis requiere indicar el tipo completo, esto va a simplificar las cosas</note> |
| >(run-p-sl '{with {x name {printn 1}} | |
| {+ x x}}) | |
| (result 2 '("1" "1")) | |
| </code> | |
| |
| ==== Modificación de la gramática y parser ===== | ==== Modificación de la gramática y parser ===== |
| | {if0 <SL> <SL> <SL>} | | {if0 <SL> <SL> <SL>} |
| ;ocupamos [] para denotar algo opcional (no se escriben los []) | ;ocupamos [] para denotar algo opcional (no se escriben los []) |
| | {with {<sym> [: <mod>] <SL>} <SL>} | | {with {<sym> [: <mtype>] <SL>} <SL>} |
| | <id> | | <id> |
| | {<SL> <SL>} | | {<SL> <SL>} |
| </code> | </code> |
| |
| Ahora ''with'' admite un modificador opcional que cambiará el modificador de tipo de la expresión nombrada al símbolo. | Ahora ''with'' admite un tipo opcional que especificará el método de evaluación de la expresión nombrada. |
| |
| * (0.1 ptos) Cambie la sintaxis de la estructura ''swith'' para que admita un modificador. | * (0.1 ptos) Cambie la sintaxis de la estructura ''swith'' para que admita un tipo opcional. |
| * (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 la función ''parse-sl'' para manejar los casos en que sí hay tipos opcionales. En caso de no haber, puede usar ''#f'' como tipo por defecto. Recuerde manejar el caso ''{value <Type>}''. |
| * (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 ''type-ast'' para que cambie el método de evaluación 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. | * (0.3 ptos) Modifique el caso ''swith'' en la función ''transform'' para que se interprete de forma correcta la expresión nombrada. |