Differences

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

Link to this comparison view

Both sides previous revisionPrevious revision
Next revision
Previous revision
teaching:cc4101:tareas:2026-1:tarea2:parte3 [2026/05/11 03:24] – [3.2 Chequeo de tipos] hint actualizacion type-ast bduarteteaching:cc4101:tareas:2026-1:tarea2:parte3 [2026/05/11 15:48] (current) – [3.3 Transformación a CL] msegur
Line 88: Line 88:
 ==== 3.3 Transformación a CL ==== ==== 3.3 Transformación a CL ====
  
-Ahora que el lenguaje soporta tipos con modificadores, es necesario implementar las semánticas correspondientes. Esto se va a realizar en la transformación de un programa SL a un programa CL.+Ahora que el lenguaje soporta tipos con modificadores, es necesario implementar las semánticas correspondientes. Esto se va a realizar en la transformación de un programa SL a un programa CL. Nótese que el lenguaje CL no tiene distintas semánticas de evaluación: la función de transformación debe transformar expresiones ''lazy'' del lenguaje SL en expresiones normales del lenguaje ''CL'' que sean equivalentes. 
 + 
 +Por ejemplo, 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. Por el otro lado, si se requiere una evaluación temprana y el argumento fue declarado lazy o by-name, entonces es necesario evaluarlo en ese momento. 
 + 
 +<note tip> 
 +Algunas cosas que se debe tener en cuenta: 
 +  * Recuerde que la diferencia entre lazy (a.k.a. by-need) y by-name es que la primera evalúa una sola vez la expresión y luego "recuerda" el valor para próximos usos. Le puede ser útil lo realizado en la Parte 2 con funciones memoizadas! 
 +  * En el caso de ''if0'', considere el caso donde las ramas tienen distintos modificadores. ¿Qué se puede hacer en ese caso? 
 +</note> 
   * (1.4 pto) Modifique la función de transformación para que se apliquen los ajustes necesarios.   * (1.4 pto) Modifique la función de transformación para que se apliquen los ajustes necesarios.
  
Line 95: Line 104:
 </note> </note>
  
-<note tip> 
-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. 
-  * 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 tanto la función como el argumento calzan en la estrategia, entonces no hay nada que hacer. 
-  * Recuerde que la diferencia entre lazy (a.k.a. by-need) y by-name es que la primera evalúa una sola vez la expresión y luego "recuerda" el valor para próximos usos. Le puede ser útil lo realizado en la Parte 2 con funciones memoizadas! 
  
-</note>