Programar con Variables Locales y Globales: un Ejemplo Detallado

Los programas Logo generalmente presentan una combinación de variables locales y globales. Vamos a desmenuzar el siguiente ejemplo, con el objeto de tener una visión más completa del propósito de estas variables.

El siguiente programa permite traducir un número determinado de palabras a otro idioma:

para recordar :palabra :traducción
da :palabra :traducción
fin

para recordar-muchas :lista
si vacía? :lista [alto]
recordar ítem 1 :lista
ítem 2 :lista
recordar-muchas menosprimero menosprimero :lista
fin

para traducir-muchas :lista
asigna [resultado [ ]]
cumplelista [pal :lista][da "resultado fr :resultado traducir :pal]
reporta :resultado
fin

para traducir :palabra
reporta cosa :palabra
fin

El procedimiento recordar utiliza el mando da. Aquí se necesita una variable global, porque la traducción de cada palabra es un dato que es necesario que el programa recuerde para poder consultar.

recordar "hola "hello
muestra :hola

hello
muestra traducir "hola
hello

Recordar-muchas tiene una lista como entrada. Es un procedimiento recursivo, de modo que cada recordar-muchas tiene su propia entrada que transmite al procedimiento recordar. :Lista es una variable local que es temporaria y que cambia con cada llamada recursiva.

Recordar-muchas [el the cielo sky es is azul blue]

Vamos a rastrear recordar-muchas para ver cómo cambian las entradas y cómo se procesa cada par de palabras. La primitiva nombres reporta las variables globales que han sido creadas.

muestra nombres
da "el "the
da "cielo "sky
da "es "is
da "azul "blue

Traducir-muchas incluye una entrada, una expresión asigna y la instrucción cumplelista que tiene como entrada una expresión da. Vamos a probarla.

muestra traducir-muchas [el cielo es azul]
the sky is blue

Examinemos cada línea del procedimiento.

asigna [resultado [ ]] crea una variable local llamada resultado que tiene como entrada una lista vacía.

cumplelista [pal :lista] [da "resultado fr :resultado traducir :pal]

Hay dos primitivas, cumplelista y cumpleveces , que se utilizan para enlazar instrucciones. Su estructura permite asignar variables locales.

Cumplelista ejecuta un conjunto de instrucciones para cada ítem de la lista. La primera entrada establece un rango de valores para un nombre de variable temporario. En este caso, pal es una variable local que tiene como valor la lista dada como entrada; es decir, [el cielo es azul].

La segunda entrada de cumplelista ejecuta una instrucción; en este caso, la expresión da: da "resultado fr :resultado traducir :pal

Cumplelista ejecuta la instrucción da para cada ítem de la lista [el cielo es azul]. El valor de resultado sigue teniendo una nueva palabra traducida agregada al final:

fr :resultado traducir :pal

Traducir es un reportero con una entrada. Ejecuta la instrucción reporta cosa :palabra. Recuerde que cosa reporta el valor de su entrada.

muestra traducir "cielo
sky

Si el valor de :resultado es [the] en esta ronda de la instrucción cumplelista , la instrucción da cambiará su valor a [the sky].

reporta :resultado reporta el valor final de :resultado, que es [the sky is blue]

:resultado permanece como una variable local, ya que ha sido asignada por asigna. Después de ejecutar traducir-muchas, podemos probar que :resultado permanece como una variable local, aunque da es usada en una instrucción cumplelista.

muestra :resultado
resultado no tiene valor