Differences

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

Link to this comparison view

Both sides previous revisionPrevious revision
Next revision
Previous revision
teaching:cc4101:tareas:2025-1:tarea3 [2025/06/19 20:01] dibanezteaching:cc4101:tareas:2025-1:tarea3 [2025/06/19 21:09] (current) – [Tarea 3 (Entrega: TBD)] dibanez
Line 1: Line 1:
-====== Tarea 3 (Entrega: TBD) ====== +====== Tarea 3 (Entrega: 6 de Julio de 2025) ====== 
  
-Esta tarea se distribuye con un archivo zip (<<PLACEHOLDER>>) que contiene 3 archivos: main.rkt, tests.rkt y env.rkt. Los archivos están incompletos, y en ellos tiene que implementar lo que se solicita en las preguntas siguientes. +Esta tarea se distribuye con un archivo zip ({{ :teaching:cc4101:tareas:2025-1:t3-init.zip |}}) que contiene 3 archivos: main.rkt, tests.rkt y env.rkt. Los archivos están incompletos, y en ellos tiene que implementar lo que se solicita en las preguntas siguientes. 
  
 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>Consulte las normas de entrega de tareas en http://pleiad.cl/teaching/cc4101</note> <note important>Consulte las normas de entrega de tareas en http://pleiad.cl/teaching/cc4101</note>
  
-**Recuerde que el testing y calidad de código se evalúan de acuerdo a [[https://docs.google.com/document/d/1Ahtk97_teZwtpFnJ-H--rLndeiFuyeDHpoGWpC8wL5I/edit?usp=sharing|la rúbrica]].**+**Recuerde que el testing y calidad de código se evalúan de acuerdo a [[https://docs.google.com/document/d/1Ahtk97_teZwtpFnJ-H--rLndeiFuyeDHpoGWpC8wL5I/edit?usp=sharing|esta rúbrica]].**
  
 ====== Resumen ====== ====== Resumen ======
Line 302: Line 302:
 </code> </code>
  
-===== Parte 3 (extra)Campos de Clase (1 pt) =====+===== 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> 
 +<expr> ::= ... (expresiones del lenguaje base) ... 
 +        | {class {<field>*} <method>*}  
 + 
 +<field> ::= <sym> 
 +          | {cls <sym> <expr>?
 +</code> 
 + 
 +El ''?'' indica que un campo de clase puede o no incluir una expresión. Esta expresión es usada como valor inicial para el campo de clase. 
 + 
 +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 ''get'' directamente sobre el valor de la clase, o desde cualquiera de sus instancias. 
 +  * No pueden haber campos de clase o instancia con el mismo nombre. Esto debe comprobarse de forma estática. En caso de encontrarse, debe lanzar el error "duplicate fields" 
 +  * 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} 
 +                               {begin {set x x} 
 +                                      {set y {+ 1 {get self y}}}}}}} 
 +                   {o1 {init A 5}} 
 +                   {o2 {init A 10}} 
 +                   {o3 {init A 0}}} 
 +                  {get A y}}) 
 +
 +</code> 
 + 
 +<code scheme> 
 +; Programa con un mismo nombre como campo de clase e instancia. 
 +> (run-val '{with {{Foo {class {x {cls x}}}}} 
 +                  0}) 
 +"error: duplicate fields" 
 +</code> 
 + 
 +<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}}) 
 +"error: class field a not initialized" 
 +</code> 
 + 
 +<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 
 +</code> 
 + 
 +  * Realize las modificaciones necesarias para extender el lenguaje con campos de clase.