jueves, 4 de diciembre de 2014

Curso 2014-15. Logo. Pasar parámetros a primitivas que esperan una lista

Empecé a utilizar MSWLogo para enseñar programación a alumnos de ESO hace solo un par de años. La razón es que los equipos disponibles en las aulas de Tecnología en las que he tenido la oportunidad de dar clase cuentan con pocos recursos (procesador, memoria RAM, etc.) para los estándares del momento de redactar esta entrada. Sin embargo, al no disponer de otros medios, simplemente me adapté y opté por un lenguaje que aparece en diversos libros de texto, sobre todo asociado al uso de controladoras ENCONOR y CNICE.

En las primeras sesiones, tras enseñar a usar el bucle REPITE n [instrucciones], uno de los aspectos más interesantes a la hora de crear nuestros propios procedimientos es la posibilidad de pasar parámetros al código. Eso permite transformar el habitual primer ejemplo de dibujar un cuadrado de un tamaño dado en algo más dinámico, pudiendo pasar el tamaño del lado a un procedimiento CUADRADO redefinido y al que llamaré CUADRADOL :lado. Veamos el código de ambos procedimientos:



Procedimiento CUADRADO
Procedimiento CUADRADOL :lado
para cuadrado
repite 4 [ av 60 gd 90]
fin
para cuadradol :lado
repite 4 [ av :lado gd 90]
fin
Construcción de un cuadrado de lado 60 con el procedimiento CUADRADO
Construcción de un cuadrado de lado 150 con el procedimiento CUADRADOL :lado


Cuando quise extender esta idea a otras primitivas, como la que define el grosor del cursor usando una lista de parámetros entre corchetes, me tropecé con una dificultad. PONGROSOR [tamaño] se debe escribir poniendo números entre corchetes, si los sustituyes por variables no funciona.

Ejemplo:
pongrosor [10 10] ; Establece el grosor del lápiz en 10, el valor por defecto es 1
pongrosor [:g :g] ; Da error

Este mismo problema  surge con otras primitivas como PONCOLORRELLENO [rojo verde azul] o PONPOS [posición]. Revisé el manual que estaba usando: "Manual MSWLOGO abreviado 0809 con hipervínculos.pdf" y busqué en Internet sin éxito otras referencias en las que simplemente no me dijeran que sustituir los números por variables no estaba permitido.
Al final, decidí analizar el problema con más detenimiento y me dí cuenta de que lo que diferenciaba la forma de pasar parámetros a estas primitivas de las otras que ya conocía, era la existencia de los corchetes que los delimitaban. Mirando en la referencia del lenguaje, se puede ver que las listas emplean la misma sintaxis, encerrando entre corchetes los elementos que las forman. Entonces probé a construir una lista y pasarla directamente como parámetro a PONGROSOR y ¡Eureka! ¡Funciona!

Ejemplo:
El siguiente procedimiento recibe como parámetro el grosor de la línea. Los paréntesis que rodean a la primitiva LISTA son opcionales, se han escrito para distinguir con mayor claridad lo que se pasa como parámetros a PONGROSOR.
para cuadradog :grosor
    bp
    pongrosor (lista :grosor :grosor)
    repite 4 [av 100 gd 90]
fin