Differences
This shows you the differences between two versions of the page.
| teaching:cc4101:tareas:2023-1:tarea2:parte1 [2023/05/11 15:22] – created tvallejos | teaching:cc4101:tareas:2023-1:tarea2:parte1 [2023/05/11 16:23] (current) – tvallejos | ||
|---|---|---|---|
| Line 1: | Line 1: | ||
| + | [[teaching: | ||
| + | |||
| + | ===== Parte 1. Testing de efectos (2 ptos.) ===== | ||
| + | En esta sección van a implementar un mecanismo para hacer tests sobre efectos secundarios, | ||
| + | |||
| + | <note important> | ||
| + | Asegúrense de haber estudiado la [[teaching: | ||
| + | </ | ||
| + | |||
| + | En comparación con lo visto en clases, CL cuenta con una nueva expresión '' | ||
| + | |||
| + | * Escriba tests de '' | ||
| + | |||
| + | Para poder validar los valores impresos, van a utilizar una estrategia que consiste, en esencia, en redirigir la impresión desde la salida estándar hacia un //log//. Luego, los tests simplemente consisten en corroborar el estado del log. | ||
| + | |||
| + | ==== Agregando logs: primer intento ==== | ||
| + | |||
| + | En un primer intento, van a agregar logs a través de una nueva estructura de datos y manteniendo un registro global de impresiones. En seguida, actualizarán su función de interpretación para que utilice este nuevo mecanismo. | ||
| + | |||
| + | Para esta sección y la siguiente, consideren la siguiente estructura, donde se mantiene tanto el valor de ejecución como el log de impresiones. | ||
| + | |||
| + | <code scheme> | ||
| + | (deftype Result | ||
| + | (result val log)) | ||
| + | </ | ||
| + | |||
| + | Por otro lado, para mantener un log les recomendamos utilizar el mecanismo de cajas de Racket ([[https:// | ||
| + | |||
| + | <code scheme> | ||
| + | > (define log (box '())) ;; Crea una caja con valor inicial lista vacía | ||
| + | > (unbox log) ;; Abre la caja y obtiene su valor guardado | ||
| + | '() | ||
| + | > (set-box! log (cons " | ||
| + | > (set-box! log (cons " | ||
| + | > (unbox log) | ||
| + | ' | ||
| + | </ | ||
| + | |||
| + | Con estos dos elementos, van a reemplazar la función '' | ||
| + | * Defina una nueva función de impresión '' | ||
| + | * Modifique '' | ||
| + | * Defina una función '' | ||
| + | * Defina tests para verificar que efectivamente es capaz de testear la salida de las impresiones. | ||
| + | |||
| + | Llegados a este punto, ¡ya son capaces de testear las impresiones de caracteres! Sin embargo, este enfoque tiene dos problemas importantes: | ||
| + | - Ya no se imprime en pantalla m(. | ||
| + | - El uso de un valor global no es adecuado en un contexto concurrente (p.ej. si se ejecutasen tests en paralelo, el log resultante sería impredecible e incorrecto). | ||
| + | |||
| + | En lo que sigue verán cómo solucionar estos puntos. | ||
| + | |||
| ==== Segundo intento: alcance dinámico ==== | ==== Segundo intento: alcance dinámico ==== | ||

