Differences
This shows you the differences between two versions of the page.
| Next revision | Previous revision | ||
| teaching:cc4101:tareas:2022-1:tarea3 [2022/06/07 16:48] – created rodrigo.urrea | teaching:cc4101:tareas:2022-1:tarea3 [2023/06/14 20:55] (current) – [Tarea 3 (Entrega: 9 de julio de 2023)] rodrigo.urrea | ||
|---|---|---|---|
| Line 8: | Line 8: | ||
| **¡Los tests, los contratos y las descripciones forman parte de su evaluación!** | **¡Los tests, los contratos y las descripciones forman parte de su evaluación!** | ||
| + | |||
| + | ====== 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 '' | ||
| + | |||
| + | |||
| + | La tarea está dividida en 2 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. | ||
| + | |||
| + | - **Herencia Simple **: El objetivo de esta sección es extender el lenguaje con herencia simple, incluyendo //field shadowing// y llamados con '' | ||
| + | |||
| + | ===== Clases y objetos (3,0 ptos.) ===== | ||
| + | A continuación se presenta la sintaxis del lenguaje extendido (se omiten las del lenguaje base): | ||
| + | <code scheme> | ||
| + | < | ||
| + | | {class {< | ||
| + | | {new < | ||
| + | | {get < | ||
| + | | {set <id> < | ||
| + | | {-> < | ||
| + | | self | ||
| + | | null | ||
| + | |||
| + | < | ||
| + | |||
| + | </ | ||
| + | Donde: | ||
| + | * '' | ||
| + | * '' | ||
| + | * '' | ||
| + | * '' | ||
| + | * '' | ||
| + | * '' | ||
| + | * '' | ||
| + | * '' | ||
| + | |||
| + | Además, para la creación de un objeto, los constructores son simplemente métodos llamados '' | ||
| + | |||
| + | **Extienda el lenguaje para soportar estas expresiones, | ||
| + | Además, los errores deben manejarse de la siguiente forma: | ||
| + | * El acceso a un campo inexistente de un objeto debe arrojar el error '' | ||
| + | * La invocación de un método inexistente debe lanzar el error '' | ||
| + | * La creación de un objeto con un número invalido de argumentos debe lanzar el error '' | ||
| + | * Invocar un método sobre '' | ||
| + | * Al crear una clase con 2 o más constructores de igual aridad, debe lanzar el error '' | ||
| + | |||
| + | Veamos algunos ejemplos de clases y objetos en acción: | ||
| + | |||
| + | |||
| + | <code scheme> | ||
| + | ;; comportamiento esperado | ||
| + | > (run-val '{with {{c {class {x y} | ||
| + | {def init {} | ||
| + | {begin {set x 1} {set y 2}}} | ||
| + | {def init {init-x init-y} | ||
| + | {begin {set x init-x} {set y init-y}}} | ||
| + | {def sum {z} {+ {get self x} {+ {get self y} z}}} | ||
| + | {def set-x {val} {set x val}}}} | ||
| + | {o {new c {3 4}}}} | ||
| + | {begin | ||
| + | {-> o set-x {+ 1 3}} | ||
| + | {+ {-> o sum 3} {get o y}}}}) | ||
| + | 15 | ||
| + | </ | ||
| + | |||
| + | <code scheme> | ||
| + | ;; las clases son valores | ||
| + | > (run-val '{with {{A {class {} | ||
| + | {def apply {c} {-> {new c} m}}}} | ||
| + | {o {new A}}} | ||
| + | {-> o apply {class {x} | ||
| + | {def init {} {set x 2}} | ||
| + | {def m {} {get self x}}}}}) | ||
| + | 2 | ||
| + | </ | ||
| + | |||
| + | |||
| + | <code scheme> | ||
| + | ;;la definición de la clase tiene scope léxico | ||
| + | > (run-val ' | ||
| + | {def init {} {set x 2}} | ||
| + | {def init {init-x} {set x init-x}} | ||
| + | {def m {} {get self x}}}}} | ||
| + | 10} | ||
| + | {new A}}) | ||
| + | "free identifier: A" | ||
| + | </ | ||
| + | |||
| + | <code scheme> | ||
| + | ;; los identificadores dentro de una clase tienen scope léxico | ||
| + | ;; (note el uso de la “x” en la definición del método “m” | ||
| + | > (run-val '{with {{x 10} | ||
| + | {A {class {} | ||
| + | {def m {y} {+ x y}}}} | ||
| + | {o {new A}}} | ||
| + | {-> o m 1}}) | ||
| + | 11 | ||
| + | </ | ||
| + | |||
| + | <code scheme> | ||
| + | ;; no se pueden repetir los constructores con mismo número de parámetros | ||
| + | > (run-val ' | ||
| + | {def init {init-x init-y} | ||
| + | | ||
| + | {def init {init-x init-y} | ||
| + | | ||
| + | {def init {init-x} {set x init-x}} | ||
| + | {def m {} {get self x}}}}} | ||
| + | 10} | ||
| + | {new A}}) | ||
| + | " | ||
| + | </ | ||
| + | |||
| + | <code scheme> | ||
| + | ;; Una clase sin constructores puede ser creado solo con {new class}, sin argumentos | ||
| + | > (run-val '{with {{x 10} | ||
| + | {A {class {z} | ||
| + | {def m {y} {+ x y}}}} | ||
| + | {o {new A {x}}}} | ||
| + | {-> o m 1}}) | ||
| + | " | ||
| + | </ | ||
| + | |||
| + | ===== Herencia Simple (3,0 ptos.) ===== | ||
| + | Extienda su lenguaje con herencia simple, incluyendo //field shadowing// y llamados con '' | ||
| + | |||
| + | La sintaxis extendida es: <code scheme> | ||
| + | < | ||
| + | ;; Cambio para incluir superclase | ||
| + | | {class [: < | ||
| + | | {super <id> < | ||
| + | </ | ||
| + | Se modifica la forma '' | ||
| + | - (1.0) Implemente la búsqueda de métodos (([[http:// | ||
| + | |||
| + | ;; el método f se busca en c y luego en su superclase | ||
| + | > (run-val '{with {{c1 {class {} | ||
| + | {def f {z} {< z 7}}}} | ||
| + | {c {class : c1 {}}} | ||
| + | {o {new c}}} | ||
| + | {-> o f 20}}) | ||
| + | #f | ||
| + | </ | ||
| + | - (1.0) Implemente el soporte para llamados con '' | ||
| + | ;; llamada a super de método no definido en el padre directo | ||
| + | (run-val '{with {{c2 {class {} | ||
| + | {def h {x} {+ x 1}}}} | ||
| + | {c1 {class : c2 {} | ||
| + | {def f {} #f}}} | ||
| + | {c {class : c1 {} | ||
| + | {def g {} {super h 10}}}} | ||
| + | {o {new c}}} | ||
| + | {-> o g}}) | ||
| + | 11 | ||
| + | </ | ||
| + | - (1.0) Implemente la semántica de field shadowing (([[http:// | ||
| + | > (run-val '{with {{A {class {x y} | ||
| + | {def init {} {begin {set x 1} {set y 0}}} | ||
| + | {def ax {} {get self x}}}} | ||
| + | {B {class : A {x} | ||
| + | {def init {} {set x 2}} | ||
| + | {def bx {} {get self x}}}} | ||
| + | {b {new B}}} | ||
| + | {-> b ax}}) | ||
| + | 1 | ||
| + | </ | ||
| + | Nota: | ||
| + | * Los llamados con '' | ||
| + | * No olvide incluir a la clase '' | ||
| + | |||

