Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Next revision
Previous revision
teaching:cc4101:tareas:2022-1:tarea2:parte3 [2022/05/04 15:58] – created tdiazteaching:cc4101:tareas:2022-1:tarea2:parte3 [2023/05/08 16:03] (current) – [3.1 Modificadores] tvallejos
Line 41: Line 41:
          | <id>          | <id>
          | {<SL> <SL>}          | {<SL> <SL>}
-         | {fun <mtype> {<sym>} <SL> ;; note el uso de mtype (tipos con modificadores)+         | {fun {<sym> : <mtype>} : <mtype> <SL> ;; note el uso de mtype (tipos con modificadores)
          | {printn <SL>}          | {printn <SL>}
  
Line 53: Line 53:
          | {<mtype> -> <mtype>}          | {<mtype> -> <mtype>}
 </code> </code>
-(Note la definición mutuamente recursiva entre ''<type>'' y ''<mtype>'') 
  
   * (0.1 ptos) Modifique la definición de ''Type'' para que soporte tipos con modificadores (para las distintas estrategias de evaluación no es necesario definir un tipo de dato, puede utilizar símbolos).   * (0.1 ptos) Modifique la definición de ''Type'' para que soporte tipos con modificadores (para las distintas estrategias de evaluación no es necesario definir un tipo de dato, puede utilizar símbolos).
Line 60: Line 59:
  
 **Hint**: si bien en la sintaxis solo existen dos modificadores, internamente es más conveniente tener 3 (incluyendo uno para eager), así todo tipo tiene un modificador. **Hint**: si bien en la sintaxis solo existen dos modificadores, internamente es más conveniente tener 3 (incluyendo uno para eager), así todo tipo tiene un modificador.
 +
 +**Observaciones**: 
 +  * Note la definición mutuamente recursiva entre ''<type>'' y ''<mtype>''. Esta definición nos permite crear (entre otros tipos) funciones de tipo ''(lazy Num) -> (name Num)'', es decir, una función que toma como argumento una expresión que produce un Num (sin evaluarla, y la evalua de manera lazy si es necesario), y retorna una expresión que produce un Num (sin evaluarla, y deberá ser evaluada tantas veces como sea utilizada). 
 +  * Se puede pensar ''lazy X'' y ''name X'' como el tipo de las promesas que producen ''X''.
 +  * Note también que los modificadores solo se pueden aplicar al dominio y al codominio. Por lo que una funcion no puede tener tipo ''{lazy {Num -> Num}}'', pero si tipo ''%%{{lazy {Num -> Num}} -> Num}%%'' o ''{Num -> {lazy {Num -> Num}}}''.
  
 ---- ----
Line 82: Line 86:
 Para una correcta transformación, considere las siguientes observaciones: Para una correcta transformación, considere las siguientes observaciones:
   * Si se requiere un argumento con estrategia lazy o by-name, y se usa un argumento que tiene evaluación temprana, entonces hay que ajustar la expresión de tal manera que se retrase su evaluación.   * Si se requiere un argumento con estrategia lazy o by-name, y se usa un argumento que tiene evaluación temprana, entonces hay que ajustar la expresión de tal manera que se retrase su evaluación.
 +  * Una forma de retrasar la evaluación de una expresión ''%%e%%'', es ponerla en el cuerpo de una lambda ''%%(lambda (_) e)%%''. Luego para evaluarla basta aplicar la función.
   * Si se requiere una evaluación temprana y el argumento fue declarado lazy o by-name, entonces es necesario ajustarlo para que efectivamente se evalúe en ese punto.   * Si se requiere una evaluación temprana y el argumento fue declarado lazy o by-name, entonces es necesario ajustarlo para que efectivamente se evalúe en ese punto.
   * Si tanto la función como el argumento calzan en la estrategia, entonces no es necesario hacer cambios.   * Si tanto la función como el argumento calzan en la estrategia, entonces no es necesario hacer cambios.