This is an old revision of the document!


<< Volver

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. 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 swith para que admita un modificador.
  • (0.2 ptos) Modifique la función parse-sl para manejar los casos en que sí hay modificadores (en caso de no haber puede ocupar #f como modificador default y recuerde manejar el caso value)
  • (0.2 ptos) Modifique el caso swith en la función type-ast para que cambie el modificador de la expresión bindeada (en caso de no haber dejelo tal cual).
  • (0.2 ptos) Modifique el caso swith en la función transform para que se interprete de forma correcta la expresión bindeada.