<< Volver

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. 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.