Next revision | Previous revision |
teaching:cc4101:tareas:2023-1:tarea3 [2023/06/15 16:57] – created rodrigo.urrea | teaching:cc4101:tareas:2023-1:tarea3 [2023/07/07 18:34] (current) – [Herencia Simple (3,0 ptos.)] rodrigo.urrea |
---|
<expr> ::= ... (expresiones del lenguaje entregado) ... | <expr> ::= ... (expresiones del lenguaje entregado) ... |
| {class {<id>*} <method>*} | | {class {<id>*} <method>*} |
| {new <expr> <expr>*} | | {new <expr> {<expr>*}} |
| {get <expr> <id>} | | {get <expr> <id>} |
| {set <id> <expr>} | | {set <id> <expr>} |
Donde: | Donde: |
* ''class'' permite crear una nueva clase anónima, con una lista de 0 o más identificadores para los campos seguida de 0 o más métodos. | * ''class'' permite crear una nueva clase anónima, con una lista de 0 o más identificadores para los campos seguida de 0 o más métodos. |
* ''new'' permite crear una instancia de una clase dada (primera expr), inicializando sus campos con los argumentos entregados despues (más abajo se detallan ciertas consideraciones a tener en cuenta). | * ''new'' permite crear una instancia de una clase dada (primera expr), inicializando sus campos con una lista de expresiones entregadas después (más abajo se detallan ciertas consideraciones a tener en cuenta). |
* ''get'' permite acceder al campo ''<id>'' de un objeto dado. | * ''get'' permite acceder al campo ''<id>'' de un objeto dado. |
* ''set'' permite modificar el campo ''<id>'' de un objeto. Solamente es válido usar ''set'' dentro del cuerpo de un método y para modificar campos propios del objeto desde donde se llama. No es posible modificar campos de un objeto externo. | * ''set'' permite modificar el campo ''<id>'' de un objeto. Solamente es válido usar ''set'' dentro del cuerpo de un método y para modificar campos propios del objeto desde donde se llama. No es posible modificar campos de un objeto externo. |
* ''def'' permite definir un método, donde se especifica el nombre del método, 0 o más parámetros, y el cuerpo del método. | * ''def'' permite definir un método, donde se especifica el nombre del método, 0 o más parámetros, y el cuerpo del método. |
| |
Además, para la creación de un objeto, los constructores son simplemente métodos llamados ''init''. Es posible definir varios métodos ''init'', sin embargo, definir varios constructores con la misma aridad es un error (//en tiempo de creación de la clase//). Cuando se ejecuta un ''new'', se selecciona el constructor que corresponda al número de argumentos pasados (error si no hay ninguno que calza). Si no hay ningún constructor declarado, solo se puede usar ''(new c)'' sin argumentos (constructor por defecto). . | Además, para la creación de un objeto, los constructores son simplemente métodos llamados ''init''. Es posible definir varios métodos ''init'', sin embargo, definir varios constructores con la misma aridad es un error (//en tiempo de creación de la clase//). Cuando se ejecuta un ''new'', se selecciona el constructor que corresponda al número de argumentos pasados (error si no hay ninguno que calza). Si no hay ningún constructor declarado, solo se puede usar ''{new c {}}'' sin argumentos (constructor por defecto). . |
| |
**Extienda el lenguaje para soportar estas expresiones, donde tanto clases y objetos son valores.** Usted debe decidir los atributos que tendrán sus respectivos nodos en el AST. Si se encuentra con casos no especificados anteriormente debe tomar supuestos e indicarlo en su entrega. Modifique el parser y el intérprete para soportar el lenguaje extendido. | **Extienda el lenguaje para soportar estas expresiones, donde tanto clases y objetos son valores.** Usted debe decidir los atributos que tendrán sus respectivos nodos en el AST. Si se encuentra con casos no especificados anteriormente debe tomar supuestos e indicarlo en su entrega. Modifique el parser y el intérprete para soportar el lenguaje extendido. |
;; las clases son valores | ;; las clases son valores |
> (run-val '{with {{A {class {} | > (run-val '{with {{A {class {} |
{def apply {c} {-> {new c} m}}}} | {def apply {c} {-> {new c {}} m}}}} |
{o {new A}}} | {o {new A {}}}} |
{-> o apply {class {x} | {-> o apply {class {x} |
{def init {} {set x 2}} | {def init {} {set x 2}} |
{def m {} {get self x}}}}} | {def m {} {get self x}}}}} |
10} | 10} |
{new A}}) | {new A {}}}) |
"free identifier: A" | "free identifier: A" |
</code> | </code> |
{A {class {} | {A {class {} |
{def m {y} {+ x y}}}} | {def m {y} {+ x y}}}} |
{o {new A}}} | {o {new A {}}}} |
{-> o m 1}}) | {-> o m 1}}) |
11 | 11 |
| |
<code scheme> | <code scheme> |
;; Una clase sin constructores puede ser creado solo con {new class}, sin argumentos | ;; Una clase sin constructores puede ser creado solo con {new class {}}, sin argumentos |
> (run-val '{with {{x 10} | > (run-val '{with {{x 10} |
{A {class {x}}} | {A {class {x}}} |
{def init {init-x} {set x 12}}}}} | {def init {init-x} {set x 12}}}}} |
10} | 10} |
{new A}}) | {new A {}}}) |
"error: same arity constructor exception" | "error: same arity constructor exception" |
</code> | </code> |
{def f {z} {< z 7}}}} | {def f {z} {< z 7}}}} |
{B {class : A {}}} | {B {class : A {}}} |
{o {new B}}} | {o {new B {}}}} |
{-> o f 20}}) | {-> o f 20}}) |
#f | #f |
{def g {} {super h 10}} | {def g {} {super h 10}} |
{def h {} {+ 1 x}}}} | {def h {} {+ 1 x}}}} |
{o {new C}}} | {o {new C {}}}} |
{-> o g}}) | {-> o g}}) |
11 | 11 |
{def init {} {set x 2}} | {def init {} {set x 2}} |
{def bx {} {get self x}}}} | {def bx {} {get self x}}}} |
{b {new B}}} | {b {new B {}}}} |
{-> b ax}}) | {-> b ax}}) |
1 | 1 |
<code scheme> | <code scheme> |
;; No se puede usar super fuera de un método | ;; No se puede usar super fuera de un método |
> (run-val 'super) | > (run-val {'super 'x}) |
"error: super outside method exception" | "error: super outside method exception" |
</code> | </code> |
* No olvide incluir a la clase ''Object'' en el ambiente inicial de ejecución. | * No olvide incluir a la clase ''Object'' en el ambiente inicial de ejecución. |