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 '' | ||
+ |