Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Next revision
Previous revision
teaching:cc4101:tareas:2023-1:tarea3 [2023/06/15 16:57] – created rodrigo.urreateaching:cc4101:tareas:2023-1:tarea3 [2023/07/07 18:34] (current) – [Herencia Simple (3,0 ptos.)] rodrigo.urrea
Line 25: Line 25:
 <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>}
Line 36: Line 36:
 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.
Line 43: Line 43:
   * ''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.
Line 77: Line 77:
 ;; 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}}
Line 93: Line 93:
                                {def m {} {get self x}}}}}                                {def m {} {get self x}}}}}
                      10}                      10}
-                   {new A}})+                   {new A {}}})
 "free identifier: A" "free identifier: A"
 </code> </code>
Line 103: Line 103:
                    {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            
Line 145: Line 145:
  
 <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}}}
Line 159: Line 159:
                                {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>
Line 180: Line 180:
                            {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
Line 193: Line 193:
                          {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
Line 204: Line 204:
                            {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
Line 212: Line 212:
 <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.