Scheme y 'GOTO': Emulación con Continuaciones

Fuentes: Emulating GOTO in Scheme with continuations

Este artículo explora cómo emular la instrucción GOTO en el lenguaje Scheme utilizando continuaciones. GOTO es una instrucción de control de flujo que permite saltar a una línea específica de código, algo que Scheme, por diseño, no ofrece directamente. Dijkstra, en su famoso artículo, criticó GOTO por su propensión a generar código desordenado, pero el artículo argumenta que, si se usa con moderación, puede ser útil en ciertos contextos.

El artículo comienza explicando cómo funciona GOTO en lenguajes como BASIC y C, destacando su capacidad para alterar el flujo normal de ejecución. Luego introduce el concepto de call/cc (call-with-current-continuation), una característica poderosa de Scheme que permite capturar y manipular el contexto de ejecución actual. call/cc toma una función como argumento y la ejecuta con el contexto de ejecución actual (la continuación) como un argumento. Esto permite a la función modificar el flujo de control de maneras que normalmente no serían posibles.

El artículo presenta un ejemplo complejo que ilustra cómo call/cc funciona, mostrando cómo se puede usar para crear bucles infinitos y para simular el comportamiento de una función que devuelve múltiples valores. Finalmente, el artículo define una macro with-goto que utiliza call/cc y syntax-rules para proporcionar una sintaxis similar a GOTO en Scheme. Esta macro define etiquetas (labels) que son esencialmente funciones que contienen el código al que se desea saltar. La macro with-goto crea una función goto que, cuando se llama con una etiqueta, ejecuta la función correspondiente a esa etiqueta, esencialmente saltando a esa parte del código. Se proporcionan ejemplos de cómo usar with-goto para crear bucles y para implementar lógica de limpieza en situaciones similares a las que se usaría GOTO en C.

En resumen, el artículo demuestra una forma creativa de utilizar continuaciones en Scheme para emular un comportamiento que, aunque criticado en otros lenguajes, puede ser útil en contextos específicos, siempre y cuando se use con cuidado y dentro de un ámbito limitado. El uso de macros permite encapsular esta funcionalidad y ofrecer una sintaxis más intuitiva para los programadores.