| Both sides previous revisionPrevious revisionNext revision | Previous revision |
| teaching:cc4101:tareas:2026-1:tarea2:bonus [2026/05/11 07:36] – [Parte BONUS. Casteo de evaluación] bduarte | teaching:cc4101:tareas:2026-1:tarea2:bonus [2026/05/11 17:52] (current) – [Parte BONUS. Modificadores de with (1.0 pto)] Reformulación enunciado 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. Con la gramática de la parte 3 era verboso crear funciones lazy o call-by-name: | 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> | |
| | |
| Con la modificación del ''with'' será mucho más simple: | |
| |
| <code scheme> | <code scheme> |
| '{with {foo name {fun {x : Num} -> Num : | {with {x : {name Num} {printn 10}} |
| x}} | {+ x x}} |
| foo} | |
| </code> | </code> |
| |
| Aparte podemos 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> [: <mod>] <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 bindeada al símbolo. | 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 del ''swith'' para que admita un modificador. | * (0.1 ptos) Cambie la sintaxis de la estructura ''swith'' para que admita un modificador. |
| * (0.2 ptos) Modifique la función ''parse-sl'' para manejar los casos en que sí hay modificadores (en caso de no haber puede ocupar ''#f'' como modificador default y recuerde manejar el caso ''value'') | * (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.2 ptos) Modifique el caso ''swith'' en la función ''type-ast'' para que cambie el modificador de la expresión bindeada (en caso de no haber dejelo tal cual). | * (0.3 ptos) Modifique el caso ''swith'' en la función ''type-ast'' para que cambie el modificador de la expresión nombrada. |
| * (0.2 ptos) Modifique el caso ''swith'' en la función ''transform'' para que se interprete de forma correcta la expresión bindeada. | * (0.3 ptos) Modifique el caso ''swith'' en la función ''transform'' para que se interprete de forma correcta la expresión nombrada. |