This is an old revision of the document!
Parte BONUS. Casteo de evaluación
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:
{with {by-name {fun {f : {Num -> Num}} -> {name {Num -> Num}} : f}} {with {foo {fun {x : Num} -> Num : x}} {by-name foo}}}
Con la modificación del with será mucho más simple:
'{with {foo name {fun {x : Num} -> Num : x}} foo}
Aparte podemos 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:
<SL> ::= <num> | {+ <SL> <SL>} | {if0 <SL> <SL> <SL>} ;ocupamos [] para denotar algo opcional (no se escriben los []) | {with {<sym> [<mod>] <SL>} <SL>} | <id> | {<SL> <SL>} | {fun {<sym> : <mtype>} -> <mtype> : <SL>} | {printn <SL>}
Ahora with admite un modificador opcional que cambiará el modificador de tipo de la expresión bindeada al símbolo.
- (0.1 ptos) Cambie la sintaxis del
swithpara que admita un modificador. - (0.2 ptos) Modifique la función
parse-slpara manejar los casos en que sí hay modificadores (en caso de no haber puede ocupar#fcomo modificador default y recuerde manejar el casovalue) - (0.2 ptos) Modifique el caso
swithen la funcióntype-astpara que cambie el modificador de la expresión bindeada (en caso de no haber dejelo tal cual). - (0.2 ptos) Modifique el caso
swithen la funcióntransformpara que se interprete de forma correcta la expresión bindeada.

