This is an old revision of the document!
Parte BONUS. Casteo de evaluación (0.7 ptos)
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:
<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 nombrada al símbolo.
- (0.1 ptos) Cambie la sintaxis de la estructura
swithpara que admita un modificador. - (0.3 ptos) Modifique la función
parse-slpara manejar los casos en que sí hay modificadore. En caso de no haber, puede usar#fcomo modificador por defecto. Recuerde manejar el casovalue. - (0.3 ptos) Modifique el caso
swithen la funcióntype-astpara que cambie el modificador 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.

