Parte BONUS. Modificadores de with (1.0 pto)
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.
Por ejemplo:
{with {x : {name Num} {printn 10}} {+ x x}}
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.
Modificación de la gramática y parser
Se modificará la gramática de la siguiente forma:
<SL> ::= <num> | {+ <SL> <SL>} | {if0 <SL> <SL> <SL>} ;ocupamos [] para denotar algo opcional (no se escriben los []) | {with {<sym> [: <mtype>] <SL>} <SL>} | <id> | {<SL> <SL>} | {fun {<sym> : <mtype>} -> <mtype> : <SL>} | {printn <SL>}
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
swithpara que admita un tipo opcional. - (0.3 ptos) Modifique la función
parse-slpara manejar los casos en que sí hay tipos opcionales. En caso de no haber, puede usar#fcomo tipo por defecto. Recuerde manejar el caso{value <Type>}. - (0.3 ptos) Modifique el caso
swithen la funcióntype-astpara que cambie el método de evaluación de la expresión nombrada. - (0.3 ptos) Modifique el caso
swithen la funcióntransformpara que se interprete de forma correcta la expresión nombrada.

