This is an old revision of the document!


Segundo intento: alcance dinámico

Una solución a los problemas introducidos en la parte anterior es utilizar alcance dinámico. En esta sección los guiaremos en el proceso, para el cual harán uso del mecanismo de parametrización provisto por Racket. Un parámetro en Racket es una “caja”, con un contenido inicial, cuyo contenido puede ser redefinido localmente, con alcance dinámico. Además, los parámetros de Racket son thread-safe.

Para comenzar, se utiliza la función make-parameter, que permite crear un parámetro. El argumento que se pasa a make-parameter representa el valor inicial del parámetro. Note que para obtener el valor asociado al parámetro, es necesario “aplicarlo”, como si fuera una función sin argumentos.

> (define location (make-parameter "here"))
> (location)  
"here"

Luego, es posible usar la expresión parameterize para redefinir el valor del parámetro con alcance dinámico. El nuevo valor es visible durante toda la ejecución del cuerpo del parametrize. En primer lugar, se pueden definir nuevos valores para parámetros definidos anteriormente y, en seguida, se define el cuerpo donde se van a ver reflejados estos cambios. La idea es que los nuevos valores quedan acotados a este espacio solamente. Fuera de la ejecución del cuerpo de parameterize, un parámetro mantiene su valor original.

> (define (where-am-I?)
    (string-append "I am " (location)))
> (where-am-I?) 
"I am here"    
> (parameterize ([location "there"])
    (where-am-I?))   ;; solo dentro de la evaluación de este cuerpo se ve el nuevo valor
"I am there"
> (where-am-I?)  ;; fuera de la ejecución del cuerpo del parameterize, location sigue teniendo su valor original
"I am here"
  • (0.5 ptos) Modifique su intérprete para que la interpretación de printn utilice un parámetro para imprimir. Es decir, el valor inicial del parámetro debe ser la función println de Racket.
  • (1 pto) Defina una nueva función de interpretación interp-p, que dada una expresión retorna un valor de tipo Result. La función debe hacer uso de interp, pero manteniendo un log local y redefiniendo el valor del parámetro. El nuevo valor del parámetro debe ser una función que registre impresiones en el log local.
  • (0.5 ptos) Provea tests para verificar que efectivamente es capaz de corroborar la salida de las impresiones.

Ahora sí, ya debiesen ser capaces de interpretar sus expresiones en dos modalidades distintas: el modo normal, donde imprimen en pantalla, y el modo de prueba, donde registran su información en un log, lo que les permite corroborar los valores impresos.