6
INTRODUCCION A LOS MICROMUNDOS PARA DESOCUPADOS. Enrique Araújoviedo. Parte I: Muestra Sinprimero [ LoBueno LoMalo LoFeo ] Lo primero que voy a decir, es que “Micromundos Pro” es una herramienta horrosa. Podrá estar basada en Logo (que sí es un lenguaje poderoso y serio), pero la herramienta tiene unas carencias impresionantes. Tal vez ese haya sido el objetivo de los programadores. Por ejemplo, una vez que una figura se ha ubicado sobre el fondo y que no se ha asignado a alguna tortuga inmediatamente se funde con el fondo impidiendo cualquier modificación, es ni siquiera se dispone de un historial de acciones para deshacer; quiere esta falencia decir que no se puede trabajar con capas. Esta es una deficiencia impresionante más cuando se trata de trabajar con muchos actores (tortugas). Cada tortuga de alguna manera trabaja en una capa propia ya que éstas se pueden intercalar; pero qué difícil es determinar en qué profundidad se encuentra una tortuga respecto de otra cuando se dispone de muchas; no existe un comando que permita establecer la secuencia de profundidad y menos aún uno que permita que dos o más se encuentren sobre un mismo plano para efectuar por ejemplo colisiones o encuentros. Las máscaras de las tortugas (o disfraces) sobredimensionan visualmente el objeto pero no así extienden el objeto; por ejemplo supongamos que a una tortuga T1 le colocamos una máscara de 179x60 px y a otra una máscara de 60x20 px, es de esperarse que si están lo suficientemente cerca su perímetro de colisión o encuentro sea bastante amplio, por el contrario las dos máscaras pueden superponerse (traslaparse) sin siquiera declararse el contacto. Más específicamente, supóngase que la máscara para T1 corresponde a una imagen de un bus y la máscara para T2 corresponde a una imagen de un automóvil y se trata de simular un cruce de una vía. Perfectamente se traslapan las máscaras sin declararse una colisión, lo que hace irreal el micromundo simulado. Existen objetos como las tortugas cuyas propiedades están ocultas para el programador; las cajas de texto no son evidentes; no hay una manera específica desde la caja de propiedades (inspector de propiedades) de declarar características tales como las barras de desplazamiento, el tipo y color de la fuente. Si se ubica una tortuga T1 en un lugar del escenario no hay manera a través de algún inspector de propiedades de determinar sus coordenadas; puede hacerse a través de la ventana de código (centro de mandos) ubicando previamente el cursor sobre el objeto y realizando un click (lo que puede activar la tortuga y desplazarla del lugar deseado), escribiendo “muestra fpos”. Nos dará una lista de las coordenadas actuales de dicho objeto; ello debería poderse hacer desde un click derecho. No existe, por otra parte, una diferencia sustantiva entre las ventanas de instrucción de los objetos, haciendo que su comportamiento instructivo sea el mismo ya se trate de una tortuga, un botón o una caja de texto. Los botones son la cosa más engorrosa: el nombre asociado (el que muestra) es el mismo del procedimiento asociado, lo que puede conducir a equívocos entre la identidad del objeto y el manejador del procedimiento ( el mensaje del handler). No es posible modificar de ninguna manera una ventana de mensajes que se activan mediante primitivas tales como “pregunta” o “respuesta”. No se pueden posicionar en un determinado

Introducción a los Micromundos para desocupados

Embed Size (px)

Citation preview

Page 1: Introducción a los Micromundos para desocupados

INTRODUCCION A LOS MICROMUNDOS PARA DESOCUPADOS.Enrique Araújoviedo.

Parte I:

Muestra Sinprimero [ LoBueno LoMalo LoFeo ]

Lo primero que voy a decir, es que “Micromundos Pro” es una herramienta horrosa. Podrá estar basada en Logo (que sí es un lenguaje poderoso y serio), pero la herramienta tiene unas carencias impresionantes. Tal vez ese haya sido el objetivo de los programadores. Por ejemplo, una vez que una figura se ha ubicado sobre el fondo y que no se ha asignado a alguna tortuga inmediatamente se funde con el fondo impidiendo cualquier modificación, es ni siquiera se dispone de un historial de acciones para deshacer; quiere esta falencia decir que no se puede trabajar con capas. Esta es una deficiencia impresionante más cuando se trata de trabajar con muchos actores (tortugas). Cada tortuga de alguna manera trabaja en una capa propia ya que éstas se pueden intercalar; pero qué difícil es determinar en qué profundidad se encuentra una tortuga respecto de otra cuando se dispone de muchas; no existe un comando que permita establecer la secuencia de profundidad y menos aún uno que permita que dos o más se encuentren sobre un mismo plano para efectuar por ejemplo colisiones o encuentros.Las máscaras de las tortugas (o disfraces) sobredimensionan visualmente el objeto pero no así extienden el objeto; por ejemplo supongamos que a una tortuga T1 le colocamos una máscara de 179x60 px y a otra una máscara de 60x20 px, es de esperarse que si están lo suficientemente cerca su perímetro de colisión o encuentro sea bastante amplio, por el contrario las dos máscaras pueden superponerse (traslaparse) sin siquiera declararse el contacto. Más específicamente, supóngase que la máscara para T1 corresponde a una imagen de un bus y la máscara para T2 corresponde a una imagen de un automóvil y se trata de simular un cruce de una vía. Perfectamente se traslapan las máscaras sin declararse una colisión, lo que hace irreal el micromundo simulado.

Existen objetos como las tortugas cuyas propiedades están ocultas para el programador; las cajas de texto no son evidentes; no hay una manera específica desde la caja de propiedades (inspector de propiedades) de declarar características tales como las barras de desplazamiento, el tipo y color de la fuente. Si se ubica una tortuga T1 en un lugar del escenario no hay manera a través de algún inspector de propiedades de determinar sus coordenadas; puede hacerse a través de la ventana de código (centro de mandos) ubicando previamente el cursor sobre el objeto y realizando un click (lo que puede activar la tortuga y desplazarla del lugar deseado), escribiendo “muestra fpos”. Nos dará una lista de las coordenadas actuales de dicho objeto; ello debería poderse hacer desde un click derecho. No existe, por otra parte, una diferencia sustantiva entre las ventanas de instrucción de los objetos, haciendo que su comportamiento instructivo sea el mismo ya se trate de una tortuga, un botón o una caja de texto. Los botones son la cosa más engorrosa: el nombre asociado (el que muestra) es el mismo del procedimiento asociado, lo que puede conducir a equívocos entre la identidad del objeto y el manejador del procedimiento ( el mensaje del handler). No es posible modificar de ninguna manera una ventana de mensajes que se activan mediante primitivas tales como “pregunta” o “respuesta”. No se pueden posicionar en un determinado

Page 2: Introducción a los Micromundos para desocupados

lugar con un tamaño específico y no se pueden crear ventanas emergentes con botones de control en una barra superior o botones cancelar y aceptar manejados por el programador.

Si de activar las tortugas se trata no existe una manera fácil de establecer una lista de activación; se puede mediante programación, pero el código no es fácil de digerir:

para mezclando :lista :resultado si (cuenta :resultado) = cuenta :lista [reporta :resultado] asigna [c1 item (1 + azar cuenta :lista) :lista] si miembro? :c1 :resultado [re mezclando :lista :resultado] re mezclando :lista ppr :c1 :resultadofin

El procedimiento anterior devuelve una lista al azar para activar (encender) las tortugas.

La manipulación de imágenes es pobre; el editor gráfico (que funciona más como un editor de íconos) es demasiado básico. Ni siquiera maneja transparencias para el diseño de las máscaras que se utilizarán para las tortugas. Si se trata de importar un “Gif” animado para incorporarlo al panel de gráficos, cada fotograma se incorpora por separado, perdiéndose precisamente la animación que debe volverse a recrear mediante máscaras invocadas sobre una misma tortuga mediante una lista de “ffig´s”. Piénsese en un Gif animado de más de 10 fotogramas; la cosa se vuelve insoportable. Debería conservarse la estructura del Gif animado en la estructura de las máscaras para incorporar una única máscara y no una secuencia; de alguna manera, la secuencia aunque no ralentiza severamente la ejecución genera líneas de código largas e improductivas, quitándole elegancia a la programación.

Ya que hablamos de elegancia, que horrible la traducción al español de la versión en inglés; la verdad es preferible trabajar con la versión inglesa. La versión en español tiene poca elegancia y estructura; se aleja enormemente de los otros “lenguajes Logo” y en lugar mejorar empeora: no es natural escribir “atrás” para retroceder. No es eficiente escribir “atrás 10 pasos” (at 10), de hecho pareciera que la orientación no se conservara sino que se pide efectuar un giro de 180 grados y luego avanzar los 10 pasos. La expresión “retrocede 10 pasos” indica con claridad que la orientación actual se conserva. Sin embargo debemos reconocer que ese fenómeno de la traducción no es sólo del Logo de Micromundos, otras versiones adolecen del mismo mal.

Algo que incomoda es la aparición de la coma para indicar que un actor va a realizar una secuencia de primitivas. Qué ocurre si se quiere que dos actores (tortugas) realicen secuencias distintas? Una vez terminada la lista de la primera secuencia, cómo indicarle al logo del micromundos que el nuevo objeto es un actor? Incomoda antetodo porque resta la característica fundamental del Logo, las listas. No quiere decir que no se entienda que la coma no puede ser un elemento de una lista sino que no cumple tal, es simplemente un separador. Eso es lo que incomoda: rompe con la elegancia de escribir listas bien elaboradas (claro que este aparte es más un pataleo de niño mimado que otra cosa).

Page 3: Introducción a los Micromundos para desocupados

Hay muchas, pero muchas cosas que no gustan de la herramienta “Micromundos Pro”; pero veamos las buenas, porque de igual manera tiene muchas y muy buenas.

Parte II: para verasigna [ variable menosúltimo menosúltimo [ LoBueno LoMalo LoFeo ] ]muestra : variablefin

Las cosas buenas no deberían ser tan complicadas como el anterior procedimiento. Y en eso hay que reconocerle a Logo el valor añadido que le otorga a la herramienta “micromundos pro”. Realmente no importa que esté mal traducido o que las palabras no sean las más bonitas, lo que se puede hacer con Logo es sencillamente excepcional. Todo depende de uno, del programador.

Una parte desconocida de Logo es precisamente el potencial de que tienen las listas, no sólo como herramientas de programación sino como objetos de aprendizaje y objetos de desarrollo de pensamiento complejo.

En esta sección vamos a ocuparnos un poco de las listas y vamos a esforzarnos por mostrar la belleza que estas le proveen a Logo y el potencial lógico de programación.

Puesto que esta introducción está dirigida para profesores no nos ocuparemos de los aspectos de la enseñabilidad (el cómo enseñar a pensar con listas a los estudiantes); eso lo haremos más adelante.

Una lista es un objeto que tiene cabeza y cola (algo así como un primero y un último elemento); pero una lista puede contener un solo elemento y en ese caso el único elemento es cabeza y cola a la vez (imagínese una fila en un supermercado; imagínese que sólo hay un cliente. Ese cliente, el único en la fila, es el primero y el último a la vez). Una lista también puede estar vacía, es decir que no tiene ningún elemento. Este por supuesto es el caso trivial, pero necesario (imagínese otra vez la fila en el supermercado; suponga que hay un solo cajero atendiendo, en algún momento el cajero se desocupará porque ha atendido a todos los de la fila y se queda a la espera que aparezca un cliente; durante ese tiempo, la fila está vacía).

Repasemos: existe una lista vacía; existe una lista con un único miembro que es cabeza y cola y de ahí en adelante es claro que una lista con más de dos miembros tiene un primer elemento (la cabeza) y un último elemento (la cola). Ahora como de lo que se trata es de listas de datos y sabemos que los tipos de datos son numéricos, alfabéticos y alfanuméricos parece obvio pensar que los elementos de una lista son estos objetos; pero no, hay todavía más: los miembros de una lista pueden ser también listas. Para concretar, diremos que los elementos de una lista pueden ser “palabras” (objetos que no son listas) y “listas”. Así pues una lista es una colección ordenada (y esto es muy importante ya que las diferencia de los conjuntos) de palabras y/o listas. Las “palabras” pueden ser un dato numérico, un dato alfanumérico, un dato alfabético e incluso una operación o un conector (lógico). Con las listas podemos construir estructuras de datos que incluyen otras palabras y listas.

Page 4: Introducción a los Micromundos para desocupados

Las listas se representan mediante corchetes cuadrados y sus elementos están contenidos dentro de éstos, así: [ 1 2 3 ] es una lista con tres miembros, a saber los datos numéricos 1, 2 y 3. En ésta lista la cabeza es el dato numérico 1 (uno) y la cola el dato numérico 3 (tres). Ahora si consideramos la lista [ 1 [ 2 3] ], se observa que es una lista que tiene una “palabra” (el dato numérico 1) y una “lista” (la lista que contiene los datos numéricos 2 y 3). Se tiene pues que la cabeza de la lista es el dato 1 y que la cola es la lista [2 3]. En ésta lista la cabeza es el dato 2 y la cola es el dato 3. Así que podemos decir que “la cabeza de la cola (la lista [2 3]) es 2” y que “la cola de la cola es 3”. En éste simple ejemplo se puede observar rápidamente la complejidad que entrañan las listas. Esto permite establecer que las listas [ 1 [ 2 3] ] y [ 1 [ 3 2] ] son distintas ya que “la cabeza de la cola” de la primera lista es distinta de “la cabeza de la cola” de la segunda lista y, de modo semejante “la cola de la cola” de la primera lista s distinta de la “cola de la cola” de la segunda lista.

Esto siempre es así, pues si tiene la lista de listas vacías [ [ ] [ [ ] [ ] ] ] y se compara con la lista de listas vacías [ [ [ ] [ ] ] [ ] ] se observa que son distintas tanto las “cabezas” como las “colas”.

Pero obviamente las listas son más claras si tienen objetos que nos sean familiares: [1 [1 2][7 [a b]]]

Una pregunta inmediata es ¿cuántos elementos posee una lista? Aunque la pregunta parece sencilla de responder, entraña cierta dificultad. Veamos. La lista anterior contiene tres elementos: “una palabra, el número 1”; la lista [1 2] y la lista [7 [a b]. El segundo y tercer elemento son también listas.

Otra pregunta básica es la diferencia entre una palabra y una lista; parece obvia. Gracias precisamente a la posibilidad de contar los elementos de una lista podemos establecer una denominación para cada elemento: a cada elemento de una lista lo llamaremos un ítem y está definido por su posición en la lista; así el ítem 4 corresponderá al elemento que se encuentra en la cuarta posición de la lista que como se dijo puede ser una lista o un caracter. En una palabra sus elementos son exclusivamente caracteres. Esta es la primera diferencia como objetos generales. Para Logo las diferencias pueden ser no tan evidentes para el usuario, por ejemplo Logo no reconoce de la misma manera una lista vacía y una palabra vacía, aunque devuelva lo mismo (un espacio). Se observa mejor esta situación si consideramos una lista que contenga una sola palabra y una sola palabra:

muestra "palabrapalabra

muestra [palabra]palabra

Aunque el resultado sea el mismo, son procesados como dos diferentes tipos de datos.

Esto hace que las operaciones que actúen sobre una lista actúen sobre los ítems de modo distinto a como lo harían operaciones similares con las palabras.

Es claro que las operaciones necesarias en una lista deben identificar los ítems, así que las primeras operaciones deben identificar el primero y último elemento sin por ello dejar de importar sus características. La operación en sí actúa sobre la posición y luego sobre el

Page 5: Introducción a los Micromundos para desocupados

contenido ubicado en dicha posición; pero cualquier operación de este tipo debe disponer de una información previa: la cantidad de miembros de una lista; pues ¿cómo saber cuál es el último si no se dispone de ese dato?

Una estructura operativa de posicionamiento sobre listas en general, responde a una regla de datos como: (cantidad de miembros: n; identificar primer elemento: ubicar puntero n-1 posiciones anteriores), si se trata del primer elemento. Si se tratara de ubicar el ítem k-ésimo la estructura sería: (cantidad de miembros: n; establecer si k<n; en caso afirmativo ubicar puntero (n-k) posiciones anteriores contadas desde el último elemento, en caso negativo indicar imposibilidad de actuar; si el caso es positivo, identificar k-ésimo miembro). Pareciera engorrosa la estructura ya que los humanos no pensamos así, ya que podemos pensar con datos incompletos (información borrosa) o asumir progresiones ascendentes sin importar la existencia de un último elemento. En las estructuras de datos orientadas a máquinas (tipo Von Newmann) ello podría implicar poner a la máquina en un loop infinito o en una situación en la que no puede parar. Pero bueno, los compiladores nos resuelven estos problemas para no tener que enfrentarnos directamente a ellos y Logo dispone de dos operaciones que nos ayudan en esta actividad: la primera sirve para contar los elementos de una lista y la segunda para ubicarse en la posición de un ítem en particular. Otra cosa es extraer el dato allí contenido. Para ello se debe disponer de una (o unas operaciones de extracción) cuya estructura de datos es semejante a como sigue: ((cantidad de miembros: n; establecer si k<n; en caso afirmativo ubicar puntero (n-k) posiciones anteriores contadas desde el último elemento, en caso negativo indicar imposibilidad de actuar); (si el caso es positivo, identificar k-ésimo miembro: establecer si el elemento es nulo –vacío-, si es una palabra o una lista; establecer la cantidad de memoria necesaria para el elemento y definir una variable temporal que contendrá una copia del elemento; copiar el elemento en la memoria temporal); si existe la petición mostrar contenido de la memoria temporal –o sea el elemento-).

Estudiar la estructura interna de las listas y cómo actúan las operaciones sobre ellas es necesario si se quiere ir más allá de la simple manipulación de las listas; la programación requiere en ocasiones pensar como razona el diseñador de los compiladores (en éste caso el intérprete, ya que Logo es un lenguaje interpretado y no compilado –que es una verdadera lástima no disponer de un compilador Logo-).

Si se disponen de las operaciones de extracción deben disponerse también de las operaciones de inserción (operaciones inversas) [obsérvese la semejanza con el manejo de las bases de datos; pero cuidado, las listas no son bases de datos aunque podemos usar listas para elaborar bases de datos –esto lo trataremos en un aparte especial-].

Resumiendo el manejo de las listas implica entender que se tiene a) un apuntador hacia el primer elemento de la lista y b) un apuntador hacia el resto de la lista. En particular Logo cuenta con un apuntador hacia el primer elemento de la lista: FIRST (en micromundos pro: primero), con un apuntador hacia el último elemento de la lista: LAST (en micromundos pro: último). La lista [ A B C D ] se almacena como una sucesión de apuntadores. En el primer nodo hay un apuntador hacia el elemento A y un apuntador hacia otro nodo, en éste hay un apuntador hacia B y otro hacia el nodo siguiente; el último nodo apuntará hacia el

Page 6: Introducción a los Micromundos para desocupados

elemento D y hacia ninguna parte –un nodo nulo-. En el siguiente árbol se muestra el almacenamiento de la lista:

Figura 1. Almacenamiento de la lista [ A B C D ]

Obsérvese ahora el manejo de los apuntadores en la lista: [[A B] [C D]]:

Figura 2. Almacenamiento de la lista [ [A B] [C D] ]

Pregúntese ahora cómo serán los árboles de las listas: [A [B C D]], [A [B] [C D]], [[A B C] [D]], [[A] [B] [C D]].

Las primitivas Logo correspondientes a las operaciones mencionadas son:

(continuará ….)

Primitiva definición ejemplo reportaprimero Reporta el primer elemento de una lista. primero [A [B] [C D]] A

último Reporta el último elemento de una lista último [A [B] [C D]] [C D]

menosprimero Reporta la lista sin el primer elemento. menosprimero [[A B C] [D]],

[[D]]

menosúltimo Reporta la lista sin el último elemento. menosúltimo [[A B C] [D]]

[[A B C]]

ítem Reporta el elemento especificado de una lista.

ítem 2 [A [B] [C D]] [B]