Differences
This shows you the differences between two versions of the page.
| Both sides previous revisionPrevious revisionNext revision | Previous revision | ||
| teaching:cc4101:tareas:2025-1:tarea3 [2025/06/19 19:46] – [Objetos (1.5 pts)] dibanez | teaching:cc4101:tareas:2025-1:tarea3 [2025/07/09 20:04] (current) – [Objetos (1.5 pts)] dibanez | ||
|---|---|---|---|
| Line 1: | Line 1: | ||
| - | ====== Tarea 3 (Entrega: | + | ====== Tarea 3 (Entrega: |
| - | Esta tarea se distribuye con un archivo zip (<< | + | Esta tarea se distribuye con un archivo zip ({{ : |
| 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 7: | Line 7: | ||
| <note important> | <note important> | ||
| - | **Recuerde que el testing y calidad de código se evalúan de acuerdo a [[https:// | + | **Recuerde que el testing y calidad de código se evalúan de acuerdo a [[https:// |
| ====== Resumen ====== | ====== Resumen ====== | ||
| Line 204: | Line 204: | ||
| {def init {x y} {begin {set x x} | {def init {x y} {begin {set x x} | ||
| {set y y}}}}}} | {set y y}}}}}} | ||
| - | {init A}}) | + | {new A}}) |
| ; Retorna una instancia donde x e y no están inicializados. | ; Retorna una instancia donde x e y no están inicializados. | ||
| </ | </ | ||
| ==== Llamados a Métodos (0.8 pto) ==== | ==== Llamados a Métodos (0.8 pto) ==== | ||
| - | |||
| - | **Extensiones del AST y Parser** | ||
| - | * [0.2 pts] Extienda el tipo de datos '' | ||
| **Extensiones de '' | **Extensiones de '' | ||
| - | * [0.2 pts] Extienda '' | + | * [0.3 pts] Extienda '' |
| **Intérprete** | **Intérprete** | ||
| - | * [0.4 pts] Extienda el intérprete para permitir evaluar la invocación de métodos de un objeto. | + | * [0.5 pts] Extienda el intérprete para permitir evaluar la invocación de métodos de un objeto. |
| **Observaciones**: | **Observaciones**: | ||
| * Recuerde en en la sección anterior (Objetos) implementó la función '' | * Recuerde en en la sección anterior (Objetos) implementó la función '' | ||
| - | * La invocación de un método inexistente | + | * La invocación de un método inexistente debe lanzar el error ''" |
| + | * Invocar un método con la cantidad equivocada de argumentos debe lanzar el error '' | ||
| A continuación se muestran programas en los que se intenta invocar un método inexistente o donde no se encuentra una sobrecarga con la aridad correcta: | A continuación se muestran programas en los que se intenta invocar un método inexistente o donde no se encuentra una sobrecarga con la aridad correcta: | ||
| Line 238: | Line 236: | ||
| {o {new A}}} | {o {new A}}} | ||
| {-> o set-x 10 20}}) | {-> o set-x 10 20}}) | ||
| - | " | + | " |
| </ | </ | ||
| ==== Acceso y Modificación a Campos (1.2 pts) ==== | ==== Acceso y Modificación a Campos (1.2 pts) ==== | ||
| - | |||
| - | **Extensiones del AST y Parser** | ||
| - | * [0.2 pts] Extienda el tipo de datos '' | ||
| - | * [0.2 pts] Extienda el tipo de datos '' | ||
| **Extensiones de '' | **Extensiones de '' | ||
| Line 263: | Line 257: | ||
| **Intérprete** | **Intérprete** | ||
| - | * [0.3 pts] Extienda el intérprete para permitir obtener el valor de un campo en una clase. | + | * [0.5 pts] Extienda el intérprete para permitir obtener el valor del campo de un objeto. |
| - | * [0.2 pts] Extienda el intérprete para permitir modificar el valor de un campo en una clase. | + | * [0.4 pts] Extienda el intérprete para permitir modificar el valor del campo de un objeto. |
| Los errores dentro de '' | Los errores dentro de '' | ||
| Line 286: | Line 280: | ||
| </ | </ | ||
| - | ===== Parte 2: Codificando funciones anónimas de primera clase con Objetos (_ pts) ===== | + | ===== Parte 2: Codificando funciones anónimas de primera clase con Objetos (1 pt) ===== |
| Ahora incorporaremos funciones anónimas de primera clase (típicamente conocidas como " | Ahora incorporaremos funciones anónimas de primera clase (típicamente conocidas como " | ||
| Line 307: | Line 301: | ||
| 8 | 8 | ||
| </ | </ | ||
| + | |||
| + | ===== Parte 3 (extra): Campos de Clase (1 pt de Bonus) ===== | ||
| + | En la parte 1 implementamos clases con campos y métodos de instancia, además de estos la mayoría de lenguajes que permiten POO soportan campos y métodos de clase, como también campos y métodos estáticos. | ||
| + | |||
| + | En esta parte extenderemos el lenguaje con campos de clase, para ello modificaremos la sintáxis de esta forma: | ||
| + | <code scheme> | ||
| + | < | ||
| + | | {class {< | ||
| + | |||
| + | < | ||
| + | | {cls <sym> < | ||
| + | </ | ||
| + | |||
| + | El ''?'' | ||
| + | |||
| + | Tenga en consideración: | ||
| + | |||
| + | * Un campo de clase solo puede ser modificado por objetos de esa clase. | ||
| + | * Un campo de clase puede ser leído usando '' | ||
| + | * No pueden haber campos de clase o instancia con el mismo nombre. Esto debe comprobarse de forma estática. En caso de encontrarse, | ||
| + | * Si un campo de clase no incluye un valor inicial, entonces se encuentra no inicializado. Intentar acceder a un campo de clase no inicializado debe lanzar el error "class field <id> not initialized" | ||
| + | |||
| + | Programas de ejemplo: | ||
| + | <code scheme> | ||
| + | > (run-val '{with {{A {class {x {cls y 0}} | ||
| + | {def init {x} | ||
| + | | ||
| + | {set y {+ 1 {get self y}}}}}}} | ||
| + | {o1 {new A 5}} | ||
| + | {o2 {new A 10}} | ||
| + | {o3 {new A 0}}} | ||
| + | {get A y}}) | ||
| + | 3 | ||
| + | </ | ||
| + | |||
| + | <code scheme> | ||
| + | ; Programa con un mismo nombre como campo de clase e instancia. | ||
| + | > (run-val '{with {{Foo {class {x {cls x}}}}} | ||
| + | 0}) | ||
| + | " | ||
| + | </ | ||
| + | |||
| + | <code scheme> | ||
| + | ; Programa que intenta leer un campo de clase no inicializado | ||
| + | > (run-val '{with {{Bar {class {cls a} {def get-a {} {get self a}}}} | ||
| + | {o {init Bar}}} | ||
| + | {-> o get-a}}) | ||
| + | " | ||
| + | </ | ||
| + | |||
| + | <code scheme> | ||
| + | > (run-val '{with {{Test {class {cls b} {def set-b {new-b} {set b new-b}}}} | ||
| + | {o1 {init Test}} | ||
| + | {o2 {init Test}} | ||
| + | {begin {-> o1 set-b #t} | ||
| + | {get o2 b}}}) | ||
| + | #t | ||
| + | </ | ||
| + | |||
| + | * Realize las modificaciones necesarias para extender el lenguaje con campos de clase. | ||
| + | |||

