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"))
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.
swith para que admita un modificador.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.swith en la función type-ast para que cambie el modificador de la expresión nombrada.swith en la función transform para que se interprete de forma correcta la expresión nombrada.