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 15:37] – [3.3 Transformación a CL] msegurteaching: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. Nótese que el lenguaje CL no tiene distintas semánticas de evaluación: la función de transformación debe ajustar los argumentos de las funciones de tal forma que coincidan con la firma y los modificadores especificadosEs decir, 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.+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> <note tip>
 Algunas cosas que se debe tener en cuenta: 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!   * 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'', se debe tener en cuenta el caso donde las ramas tienen distintos modificadores.+  * En el caso de ''if0'', considere el caso donde las ramas tienen distintos modificadores. ¿Qué se puede hacer en ese caso?
 </note> </note>