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 ==== | ||