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:xyz:2024-1:tarea3 [2024/07/11 01:55] – [Llamados a Métodos (X pts)] gricciteaching:cc4101:tareas:xyz:2024-1:tarea3 [2024/07/11 02:24] (current) – [Codificando funciones anónimas de primera clase con Objetos (1 pto)] fdiaz
Line 1: Line 1:
 ====== Tarea 3 (Entrega: X de julio de 2024) ======  ====== Tarea 3 (Entrega: X de julio de 2024) ====== 
  
-Esta tarea se distribuye con un archivo zip ({{ :teaching:cc4101:tareas:2023-1:base-t3.zip | base}}) que contiene 3 archivos: main.rkt, tests.rkt y env.rkt. Los archivos están incompletos, y en ellos tiene que implementar lo que se solicita en las preguntas siguientes. +Esta tarea se distribuye con un archivo zip ({{ :teaching:cc4101:tareas:2024-1:tarea3:tarea3-base.zip | base}}) que contiene 3 archivos: main.rkt, tests.rkt y env.rkt. Los archivos están incompletos, y en ellos tiene que implementar lo que se solicita en las preguntas siguientes. 
  
 Debe entregar via U-cursos **un archivo .zip** que contenga los archivos main.rkt y tests.rkt. Debe entregar via U-cursos **un archivo .zip** que contenga los archivos main.rkt y tests.rkt.
Line 18: Line 18:
 - **Clases y objetos**: En esta sección se pide extender el lenguaje base con clases y objetos. En particular las clases deben ser entidades de primera clase, es decir, son valores del lenguaje. - **Clases y objetos**: En esta sección se pide extender el lenguaje base con clases y objetos. En particular las clases deben ser entidades de primera clase, es decir, son valores del lenguaje.
  
-- **Codificando Lambdas con Objetos**: El objetivo de esta sección es extender el lenguaje para soportar lambdas y aplicaciones como azúcar sintáctica, usando objetos.+- **Codificando funciones anónimas de primera clase con Objetos**: El objetivo de esta sección es extender el lenguaje para soportar funciones anónimas de primera clase (típicamente conocidas como “lambdas”) y aplicaciones como azúcar sintáctica, usando objetos.
  
 <note warning>  <note warning> 
Line 178: Line 178:
 **Intérprete** **Intérprete**
   * [0.3 pts] Extienda el tipo ''Val'' con un constructor llamado ''objV'' que permita almacenar la información necesaria para representar a un objeto como valor. **Hint**: Recuerde que uno de los objetivos de tener clases, es permitir que sus intancias puedan compartir métodos.   * [0.3 pts] Extienda el tipo ''Val'' con un constructor llamado ''objV'' que permita almacenar la información necesaria para representar a un objeto como valor. **Hint**: Recuerde que uno de los objetivos de tener clases, es permitir que sus intancias puedan compartir métodos.
-  * [0.4 pts] Defina la función ''invoke-method'' que permita buscar un método dentro de un objeto e invocarlo utilizando los argumentos entregados.+  * [0.4 pts] Defina la función ''invoke-method'' que permita buscar un método dentro de la clase un objeto e invocarlo utilizando los argumentos entregados.
   * [0.4 pts] Extienda el intérprete para permitir instanciar una clase utilizando la expresión ''new''.   * [0.4 pts] Extienda el intérprete para permitir instanciar una clase utilizando la expresión ''new''.
  
Line 195: Line 195:
  
 <code scheme> <code scheme>
-;; Una clase sin constructores puede ser creado solo con {new class}, sin argumentos +;; Esta clase no tienen ningún constructor con aridad 2 
-> (run-val '{with {{x 10} +> (run-val '{begin {with {{{class {x} 
-                   {A {class {x}}+                               {def init {init-x} {set x init-x}}}}} 
-                   {{new A x}}} +                     10} 
-              1}+                   {new C 1 2}})
-"error: constructor not found" +
-</code> +
- +
-<code scheme> +
-;; Una clase sin constructores puede ser creado solo con {new class}, sin argumentos +
-> (run-val '{with {{x 10} +
-                   {A {class {x}}} +
-                   {o {new A x}}} +
-              1})+
 "error: constructor not found" "error: constructor not found"
 </code> </code>
Line 237: Line 228:
 </code> </code>
  
-==== Acceso y Modificación a Campos (pts) ====+<code scheme> 
 +;; Esta clase no tiene el método set-x definido para la aridad 2 
 +> (run-val '{with {{A {class {x} 
 +                        {def set-x {val-x} {set x val-x}}}} 
 +                   {o {new A}}} 
 +              {-> o set-x 10 20}}) 
 +"error: method set-x not found" 
 +</code> 
 + 
 +==== Acceso y Modificación a Campos (1.2 pts) ====
  
 **Extensiones del AST y Parser** **Extensiones del AST y Parser**
-  * [pts] Extienda el tipo de datos ''Expr'' y la función ''parse'' para soportar la expresión ''get'' del lenguaje. +  * [0.2 pts] Extienda el tipo de datos ''Expr'' y la función ''parse'' para soportar la expresión ''get'' del lenguaje. 
-  * [pts] Extienda el tipo de datos ''Expr'' y la función ''parse'' para soportar la expresión ''set'' del lenguaje.+  * [0.2 pts] Extienda el tipo de datos ''Expr'' y la función ''parse'' para soportar la expresión ''set'' del lenguaje.
  
 **Extensiones de ''well-formed''** **Extensiones de ''well-formed''**
Line 255: Line 255:
 </code> </code>
  
-  * [pts] Extienda ''well-formed'' para verificar el nodo ''get''+  * [0.1 pts] Extienda ''well-formed'' para verificar el nodo ''get''
-  * [pts] Extienda ''well-formed'' para verificar el nodo ''set''.+  * [0.2 pts] Extienda ''well-formed'' para verificar el nodo ''set''.
  
 **Intérprete** **Intérprete**
-  * [pts] Extienda el intérprete para permitir obtener el valor de un campo en una clase. +  * [0.3 pts] Extienda el intérprete para permitir obtener el valor de un campo en una clase. 
-  * [pts] Extienda el intérprete para permitir modificar el valor de un campo en una clase.+  * [0.2 pts] Extienda el intérprete para permitir modificar el valor de un campo en una clase.
  
 Los errores dentro de ''interp'' para objetos deben manejarse de la siguiente forma: Los errores dentro de ''interp'' para objetos deben manejarse de la siguiente forma:
Line 282: Line 282:
 </code> </code>
  
-===== Codificando Lambdas (1 pto) ===== +===== Codificando funciones anónimas de primera clase con Objetos (1 pto) ===== 
-Ahora incorporaremosmos lambdas (funciones anónimas de primera clase) a nuestro lenguaje. A diferencia de lo visto durante el curso, en esta ocasión no daremos una interpretación directa de las funciones. Usted debe idear una manera de usar la implementación de clases y objetos hecha en la parte anterior para codificar las lambdas. Esto significa que **no puede modificar** el AST y el intérprete para soportar funciones y aplicaciones de funciones. Las modificaciones que debe hacer son en el **parser**. En otras palabras, las funciones y aplicaciones serán sólo azúcar sintáctica.+Ahora incorporaremos funciones anónimas de primera clase (típicamente conocidas como "lambdas") a nuestro lenguaje. A diferencia de lo visto durante el curso, en esta ocasión no daremos una interpretación directa de las funciones. Usted debe idear una manera de usar la implementación de clases y objetos hecha en la parte anterior para codificar las lambdas. Esto significa que **no puede modificar** el AST y el intérprete para soportar funciones y aplicaciones de funciones. Las modificaciones que debe hacer son en el **parser**. En otras palabras, las funciones y aplicaciones serán sólo azúcar sintáctica. 
 + 
 +Hint: Piense en lo que comúnmente hemos visto como sintaxis de "aplicación de función" como azúcar sintáctico para la invocación de un método en un objeto, este método puede contener el código de la "función" definida. ¿De qué clase sería ese objeto? ¿Cómo se podría llamar ese método? 
 <code scheme> <code scheme>
 <expr> ::= ... <expr> ::= ...