Differences
This shows you the differences between two versions of the page.
Next revision | Previous revision | ||
teaching:cc4101:tareas:2025-1:tarea3 [2025/06/18 19:19] – created dibanez | teaching:cc4101:tareas:2025-1:tarea3 [2025/06/19 21:09] (current) – [Tarea 3 (Entrega: TBD)] 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 ====== | ||
- | El objetivo de la tarea es extender un lenguaje base para soportar clases y objetos. El lenguaje base tiene números, booleanos y operaciones sobre ellos. Además contiene expresiones '' | + | El objetivo de la tarea es extender un lenguaje base para soportar clases y objetos. El lenguaje base tiene números, booleanos y operaciones sobre ellos. Además contiene expresiones '' |
- | + | ||
- | La tarea está dividida en 2 secciones, | + | La tarea está dividida en 3 secciones, |
- **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 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, | - **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, | ||
+ | |||
+ | - **Campos de Clase (extra)**: Aquí se extendiende el lenguaje con campos mutables de clase, los que son accesibles desde la clase misma y compartidos entre todas las instancias. | ||
<note warning> | <note warning> | ||
Line 28: | Line 29: | ||
(*) nada de '' | (*) nada de '' | ||
</ | </ | ||
- | ===== Clases y objetos | + | ===== Parte 1. Clases y objetos ===== |
A continuación se presenta la sintaxis concreta del lenguaje extendido (se omiten las expresiones del lenguaje base): | A continuación se presenta la sintaxis concreta del lenguaje extendido (se omiten las expresiones del lenguaje base): | ||
<code scheme> | <code scheme> | ||
Line 51: | Line 52: | ||
* '' | * '' | ||
- | A lo largo de la implementación, | + | A lo largo de la implementación, |
Veamos algunos programas de ejemplo para ilustrar de manera general las características esperadas del lenguaje. | Veamos algunos programas de ejemplo para ilustrar de manera general las características esperadas del lenguaje. | ||
Line 108: | Line 109: | ||
==== Clases (1.5 pts) ==== | ==== Clases (1.5 pts) ==== | ||
- | |||
- | **Extensiones del AST y Parser** | ||
- | * [0.1 pts] Defina el tipo de datos '' | ||
- | * [0.1 pts] Implemente la función '' | ||
- | * [0.2 pts] Extienda el tipo de datos '' | ||
**Extensiones de '' | **Extensiones de '' | ||
Line 125: | Line 121: | ||
<code scheme> | <code scheme> | ||
- | ;; Crear una clase con campos duplicados es un error en tiempo de creación de la clase | + | ;; Crear una clase con campos duplicados es un error estático. |
> (run-val ' | > (run-val ' | ||
10} | 10} | ||
Line 133: | Line 129: | ||
<code scheme> | <code scheme> | ||
- | ;; Tener 2 init con la misma aridad es un error en tiempo de creación de la clase | + | ;; Tener 2 init con la misma aridad es un error estático. |
> (run-val ' | > (run-val ' | ||
{def init {init-x} {set x init-x}} | {def init {init-x} {set x init-x}} | ||
Line 143: | Line 139: | ||
<code scheme> | <code scheme> | ||
- | ;; Tener 2 métodos con la misma aridad es un error en tiempo de creación de la clase | + | ;; Tener 2 métodos con la misma aridad es un error estático. |
> (run-val ' | > (run-val ' | ||
{def foo {a} {set x a}} | {def foo {a} {set x a}} | ||
Line 158: | Line 154: | ||
</ | </ | ||
- | * [0.7 pts] Extienda '' | + | * [1 pt] Extienda '' |
- | **Observación**: | + | **Observación**: |
**Intérprete** | **Intérprete** | ||
- | * [0.3 pts] Extienda el tipo '' | + | * [0.4 pts] Extienda el tipo '' |
* [0.1 pts] Extienda el intérprete para soportar la creación de clases. | * [0.1 pts] Extienda el intérprete para soportar la creación de clases. | ||
- | **Observación**: | + | **Observación**: |
==== Objetos (1.5 pts) ==== | ==== Objetos (1.5 pts) ==== | ||
+ | En esta parte vamos a implementar '' | ||
- | **Extensiones del AST y Parser** | + | '' |
- | * [0.2 pts] Extienda el tipo de datos '' | + | |
+ | Si '' | ||
**Extensiones de '' | **Extensiones de '' | ||
- | * [0.2 pts] Extienda '' | + | * [0.2 pts] Extienda '' |
**Intérprete** | **Intérprete** | ||
* [0.3 pts] Extienda el tipo '' | * [0.3 pts] Extienda el tipo '' | ||
- | * [0.4 pts] Defina la función '' | + | * [0.5 pts] Defina la función '' |
- | * [0.4 pts] Extienda el intérprete para permitir instanciar una clase utilizando la expresión '' | + | * [0.5 pts] Extienda el intérprete para permitir instanciar una clase utilizando la expresión '' |
**Observación**: | **Observación**: | ||
Line 196: | Line 194: | ||
<code scheme> | <code scheme> | ||
;; Esta clase no tienen ningún constructor con aridad 2 | ;; Esta clase no tienen ningún constructor con aridad 2 | ||
- | > (run-val '{begin | + | > (run-val '{with {{C {class {x} |
- | | + | |
- | 10} | + | {new C 1 2}}) |
- | {new C 1 2}}) | + | |
" | " | ||
</ | </ | ||
+ | <code scheme> | ||
+ | > (run-val '{with {{A {class {x y} | ||
+ | {def init {x y} {begin {set x x} | ||
+ | {set y y}}}}}} | ||
+ | {init A}}) | ||
+ | ; 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 234: | 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 259: | 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 282: | Line 280: | ||
</ | </ | ||
- | ===== Codificando funciones anónimas de primera clase con Objetos (1 pto) ===== | + | ===== 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 303: | 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 {init A 5}} | ||
+ | {o2 {init A 10}} | ||
+ | {o3 {init 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. | ||
+ |