Manual Logo



Lenguaje LOGO


Primera parte:


   1-Introducción 

   2- Movimientos 

   3- Variables 

   4-Procedimientos 



Introducción


LOGO es un lenguaje simple que los niños y principiantes pueden usar para aprender los conceptos básicos de programación

   Esto no debe hacerte pensar que LOGO no es muy poderoso: de hecho, hay programas LOGO con pocas líneas que son imposibles de implementar en un lenguaje de programación profesional con tan poco código.

LOGO se usa para hacer dibujos con una "tortuga" que aparece como un pequeño triángulo en la pantalla. Sin embargo, la tortuga también sepuede oculta y puede procesar datos, solicitar información del usuario e imprimir mensajesen pantalla o crear dibujos Vectoriales SVG de alta resolución y es totalmente gratuito.


En este libro se utilizarán comandos en inglés. 

Sin embargo, también hay versiones de LOGO especialesen español .



   El lenguaje LOGO fue concebido y desarrollado en la década de 1960 por el profesor del MIT Seymour Papert. 

Hereda las técnicas de cálculo simbólico de Lisp, de las que toma parte la sintaxis y la forma de gestionar listas.


Originalmente, el se usaba para mover un robot simple, al que se le podían dar comandos como: 

ADELANTE 50 para avanzar 50 pasos 

o DERECHA 90 para girar 90 grados a la derecha. 


El primero de estos robots tenía un caparazón similar al de una tortuga, de ahí el nombre del cursor (que en las primeras versiones de pantalla era simplemente un pequeño triángulo). 

Y con elposterior desarrollo de los monitores, el lenguaje LOGO se hizo más accesible y en los años 80 se crearon versiones para computadoras personales, como la Apple II y la Commodore 64, utilizadas con fines educativos, muchas veces para el laboratorio de geometría.


En los años 80 también se creó una versión del LOGO con los comandos en otros muchos idiomascomo: Italiano, Español, portugués, etc, (ello lo convirtió en un lenguaje revolucionario y que democratizó la enseñanza de programación a niños de todo el mundo en escuelas que lo implementaron.). 

Una de las características del LOGO es que cada comando tiene una forma larga (Comando) y otra abreviada (Comando abreviado).



I   LOGO es un lenguaje de programación en el que se dan comandos a una "tortuga" o a un triángulo que sirve de cursor (que se representa con un pequeño triángulo en la pantalla, una tortuga opuede incluso ocultarse.

 

La tortuga, "caminando" sonre la pantalla, puede dibujar figuras geométricassimples y otrasde alta complejidad o escribir textos y formatearlosalestilo diseño gráfico o Word. También puede realizar cálculos matemáticos y otros procedimientos clásicos de la programación, como: Bucles, Funciones, Arreglos, Desiciones condicionales, etc.


La sintaxis del lenguaje es muy simple, pero se puede lograr una buena cantidad de cosas usando la recursividad, ya que es poderoso y flexible.


No requiere ningún conocimiento particular de informática o programación y su finalidad es justamente enseñar al que no sabe, precisamente por sus características de sencillez y claridad. 

LOGO se identifica a menudo como un "lenguaje para niños", pero eso no es todo. Sus posibles aplicaciones son muchas. 


El profesor Brian Harvey de la Universidad de Berkeley, realizó programas Logo muy significativos y enseño todo el plan de estudio de programación a sus alumos valiéndose solo de éste lenguaje

-Es posible "hablar" con la tortuga desarrollandoprocedimientos que manejen la entrada del usuario y hagan que la tortuga devuelva una salida .

-Existen múltiples implementaciones de LOGO. 

Para esta guía nos referiremos al logo  llamado Libre logo queestàenLibre Office Writer, una versión tradicional de LOGO que se utiliza directamente en el programa Writer Libre Office.  Esuna versión actual querespeta las versiones originales y las traducciones mas comunes que se utilizarn en cada idioma...Esta implementación está escrita en Python,por ello, tiene algunas modificaciones tipicas de éste lenguaje. (cada implementación de un lenguaje debe respetar o estar sujeta a ciertas normas del lenguaje en que se implementa para que no genere errores.)


Sin embargo, existen otras versiones de LOGO, también equipadas con GUI , específicas de un sistema operativo, que hacen más cómodo el trabajo.

-UCBLogo (creado en la universidad de Brkeley) y MSWLogo (Logo para Microsoft Windows) son de las mas famosas aunque ya quedaron anticuadas. (Para desarrollos mas complejos, incluso para programar dibujos en 3D se puede utilizar FMSLogo, que es una versión mas modernas.- aunque es mas complejo.)


En LOGO, un procedimiento es un conjunto de instrucciones vinculadas a un nombre propio. Los procedimientos se pueden llamar directamente desde la terminal desde la que se dan los comandos, para que se ejecuten, o incluso llamarlos desde otros procedimientos. (Procedimientos anidados unos dentro de otros.)


Puede haber parámetros en un procedimiento . 


A continuación se muestran dos ejemplos explicativos.


Un programa hecho para demostrar que LOGO no es solo un juguete (utiliza procedimientos).




Movimientos



Comenzaremos nuestro viaje en el LOGO con los movimientos de la tortuga. El movimiento de la tortuga se gestiona con comandos primitivos simples , es decir, comandos que ya están integrados en el LOGO, y que no están definidos por el usuario.

Es bueno saber que muchos comandos LOGO primitivos tienen una forma larga y otra más corta. El LOGO tiene su propia "unidad de medida": en realidad razona en "pasos" de tortuga.


Mover  

Aquí hay algunos comandos para la locomoción de tortugas:


(LAS ABREVIATURAS UTILIZAN LA PRIMERA Y LA ÙLTIMA LETRA DE LA PALABRA. 

Si es una palabra compuesta por dos, utilizará las iniciales de cada una. -PEro hay algunas excepciones, así que es bueno siempre tener una lista a mano, con las abreviaturas correctas.)



Intente escribir estos comandos en LOGO:



FORWARD 100

RIGHT 90

FORWARD 100

RIGHT 90

FORWARD 100

RIGHT 90

FORWARD 100

RIGHT 90




LA VERSIÓN CON "ALIAS" (Abreviaturas)


FD 100

RT 90

FD 100

RT 90

FD 100

RT 90

FD 100

RT 90


Obtendrás un cuadrado de 100 pasos de lado. Una forma más corta de lograr esto es:


Usando el comando REPEAT, que repite las operaciones especificadas un número específico de veces:




REPEAT 4 [FORWARD 100 RIGHT 90]




Código con ABREVIATURAS


REPEAT 4 [FD 100 RT 90]



Limpieza de pantalla 

Una vez que se ha dibujado a sí mismo con el LOGO, ¿cómo hace para que todo vuelva a ser como era al compienzo del programa? 


Hay varios comandos, con diferentes funciones para ello:




El Lápiz (Pen) 

Con LOGO, puede cambiar la forma en que dibuja la tortuga. Para empezar, podemos decidir si la tortuga, moviéndose, debe dibujar en la pantalla:

Entonces es posible establecer si la tortuga debe dibujar o borrar la trayectoria que ha realizado:


Cerrar sesión/Salir 

¿Cómo me desconecto de LOGOl? ¡ Fácil, usando el comando BYE!



BYE


    Después de saludarlo, la tortuga le agradecerá de la siguiente manera:


Gracias por usar LOGO.

Que tengas un lindo día.





Variables


Las variables estñan presentes en todos los lenguajes de programación, el concepto es fácil de entender lógicamente.

Los argumentos 

Piensa que quieres hacer un procedimiento que dibuje un cuadrado; entonces escribirías:


TO proced_cuadrado 100

forward 100

right 90

forward 100

right 90

forward 100

right 90

forward 100

right 90

END




Pero esto solo hará cuadrados de 100 pasos. Hagamos uno que tenga el doble del lado del primero:


TO proced_cuadrado 200

forward 200

right 90

forward 200

right 90

forward 200

right 90

forward 200

right 90

END


Comprenderá que es un poco incómodo anotar todos los procedimientos para cada casilla. Para flexibilizar los procedimientos, es posible especificar argumentos , escribiendo un procedimiento QUE DIBUJA UN cuadrado "genérico", que utilizará los valores proporcionados en el momento de la ejecución.


Entonces nuestro procedimiento proced_cuadrado será:


TO proced_cuadrado :lado

forward :lado

right 90

forward :lado

right 90

forward :lado

right 90

forward :lado

right 90

END



Ahora, que ya hice el procedimiento con un parámetro, si quiero dibujar un cuadrado que tenga un lado de 157 pasos, es fácil, escribo:


proced_cuadrado 157   ; al llamar a la función (Invocarla para que se ejecute)


En este caso la variable :lado toma el valor 157.



Es simple: ahora podemos pedir que dibuje cuadrados de cualqueir tamaño que le pidamos. (Poner un argumento a un procedimiento es como si le pusieramos un potenciómetro, una perilla, o un control deslizable a una parte del procedimiento, asi despues movemos esa perilla como nos guste... dándole diversos valores. 5, 15, 400, etc. )



proced_cuadrado 50 

proced_cuadrado 200 

proced_cuadrado 35 




SE PUEDEN HACER PROCEDIMIENTOS CON UNO, DOS O CIENTOS DE ARGUMENTOS. (MAGINEN QUE HACEMOS UNOS DIBUJOS DE POLÍGONOS COMPLEJOS Y LOS LLENAMOS DE PERILLAS PARA CAMBIARLES SUS VALORES.)


ESO MUCHAS VECES SE UTILIZA EN PROGRAMAS DE DISEÑO.(AUNQUE TU NO VES ESOS PARÁMETROS, PORQUE YA LOS CEÒ EL PROGRAMADOR, ESOS PARAMETROS ESTÁN YA EL CÓDIGO (SOLO VES LOS ICONOS Y DESLIZARODORES, PERILLAS Y CASILLAS PARA INGRESAR VALORES.-ES DECIR LA INTERFAZ VISUAL DE USUARIO-), TU SOLO MUEVES PERILLAS O DESLIZADORES O CAMBIAS VALORES DE COLOR TAMAÑO Y TIPO DE TRAZO, ALTURA, ANCHURA, PROFUNDIDA, ETC.)


SI ALGUNA VEZ USASTE COREL, ILUSTRATOR O PHOSTOSHOP O AUTOCAD...ESOS PROGRAMAS FUNCIONAN ASÍ CON PROCEDIMIENTOS Y MUCHSO PARÁMETROS PARA QUE PUEDAS CAMBIAR SUS VALORES A TU ANTOJO.







MAKE Y NAME

    Estos dos procedimientos primitivos (nativos del LOGO) tienen la tarea opuesta: asignar un nombre a un valor, o asignar un valor a una variable (YA QUE TODA VARIABLE Y VALOR FUNCIONAN COMO UN PAR UNA APREJA INSEPARABLE).


La sintaxis es:


   MAKE "valor mi_variable   ;con esto asignamos un valor a la variable que crearemos

   NAME valor "mi_variable   ;con esto asignamos un nombre a la variable



   Ahora ya la variable esta creada y tiene su pareja inseparable (un valor)



La primera vez que declara una variable, no usa los dos puntos sino las comillas.


Para imprimir el valor de una variable en la pantalla:


PRINT :mi_variable




También puedes trabajar con variables logrando resolver ecuaciones.:


MAKE "variable1 150

MAKE "variable2 60

MAKE "variable3 :variable1 + :variable2



PRINT :var3   ;el resultado será 210.


También podemos escribir un procedimiento que haga las sumas:


TO proced_sumar :op1 :op2

MAKE "op3 :op1+:op2

PRINT COMBINE :op1 [+]

PRINT COMBINE :op2 [=]

PRINT [-------]

PRINT :op3

END



EL COMANDO: COMBINE se utiliza para unir varios elementos.






Procedimientos


En LOGO, un procedimiento es un conjunto de instrucciones vinculadas a un nombre propio. 

Los procedimientos se pueden llamar directamente desde la terminal desde la que se dan los comandos, o incluso desde otros procedimientos.

Puede haber parámetros en un procedimiento .


Dos ejemplos:


La definición de un procedimiento sigue la siguiente sintaxis:


TO y END inician y terminan el código de un procedimiento


TO nombre_del_procedimiento 

instrucción1

instrucción2

instruccióN

END




Por ejemplo: 


TO dibuje_un_cuadrado

instrucciones...

END


   Ese es un ejemplo de procedimiento simple, sin parámetros.





Los procedimientos pueden tener argumentos (y sus nombres se escriben igual que variables).

Un argumento es algo similar a una variable pero dentro de cada procedimiento.

 

TO nombre_del_procedimiento :argumento1 :argumento2 etc

instrucción1

instrucción2

etc

END



Los argumentos pueden omitirse si el procedimiento a definir no prevé su uso.



Por ejemplo: 


TO dibuja_un_cuadrado [:de_color, :con_ancho, :con_alto]

instrucción1

instrucción2

etc

END


Ese es un procedimiento que dibuja una cuadrado con tres características distintivas...Esos son parñametros.


   Describimos varios parámetros porque a veces necesitamos hacer varios objetos similares pero con diferentes valores en su parámetros. Diferente color, tamaño, etc.

Crear procedimiento y manejar sus parámetros es cosa de lógica sentido común y aprender un poco como funciona el lenguaje. (Los procedimientos son recursos muy poderosos, porque son pequeños programas dentro de otros programas mayores.)




Ejemplos 

Aquí se explica cómo dibujar un cuadrado con lado 100.


(aqui no necesitamos poner un nombre a argumento que da el valor del tamaño de cada lado, porque haremos siempre le mismo cuadrado del mismo tamaño, así que solo ponemos 100.)


TO proced_cuadrado 100

FORWARD 100

DERECHA 90

FORWARD 100

DERECHA 90

FORWARD 100

DERECHA 90

FORWARD 100

DERECHA 90

END



El siguiente procedimiento le permite dibujar un cuadrado con lados variables. 

La sintaxis se acorta utilizando la instrucción REPEAT.


Aqui ya usamos un nombre para el único argumento del procedimiento. Porque así :tamaño_lado , luego le podemos asignar el tamaño que nos convenga cuando llamemos a que se ejecute la función (Invocación).



TO proced_cuadrado  :tamaño_lado

REPEAT 4 [FORWARD :tamaño_lado RIGHT 90]

END




Manual Logo


Segunda parte:


   1-Recursividad 

   2-Palabras y listas 

   3-Entrada y Salida 

   4-Coordenadas 

   5-Axonometría




Recursividad


Algo muy interesante y vistoso en Logo es el uso de la recursividad en los dibujos. 


   Entre otras cosas es lo que nos permite hacer fractales y otros dibujos complejos, solo aplicando unas sencillas reglas matemáticas.


Aquí vemos un caso muy básico en que en un procedimiento tengo dentro una llamada a ese mismo procedimiento. (SE AUTO-INVOCA)


Así que cuando lllamo al procedimiento se queda encerrado en un Infinity loop (Ciclo eterno). y debo frenarlo de alguna forma...salvo que deseemos crear una animación constante. (presione el botón rojo de la interface para detenerlo.)





HOME CLEARSCREEN 


;;;___Una estrella hecha con recursividad___;;;

TO estrella_recursiva :valor_lado

   FORWARD :valor_lado

   RIGHT 160

   FORWARD :valor_lado

   RIGHT 120

   estrella_recursiva :valor_lado   ;invocamos a la función dentro de la función

END


estrella_recursiva 200      ;Invocamos a la función que construye al estrella





Esto no es muy práctico salvo que se trate de realizar una animación eterna...o que podamos detenerla mediante algún botón o algú tipo de órden. - Por ejemplo podemos detener el Loop presionando el botón rojo.-




Una forma mas interesante es cambiar en cada vuelta el valor del tamaño de los lados de la estrella recursiva.


También podemos poner un código que cuente las vueltas y se detenga en el numerod e vueltas que a nosotros nos parezca bien. (Pero eso lo veremos luego).



Así que vamos con la segunda opción: 



Este ejercicio realiza el mimo loop recursivo pero vaa umentando en 10 el valor del lado, cada vez que se llama al procedimiento internamente (procedimiento que se llama a sí mismo).



HOME CLEARSCREEN 

;;;___Estrella cambiante con recursividad___;;;


TO estrella_recursiva :valor_lado

   FORWARD :valor_lado

   RIGHT 160

   FORWARD :valor_lado

   RIGHT 120

   estrella_recursiva :valor_lado + 10 ;aumenta 10

END


estrella_recursiva 50   ;llama a procecedimiento 




Como todos los procedimientos, los procesdimientos recursivos pueden no tener parámetros o ponerle todos los que necesitemos..


La recursividad es la principal forma de realizar un bucle. (que podemos reemplazar por un ciclo while )


Si quisieramos hacer lo mismo pero con el ciclo WHILE, sería de la siguiente forma.


TO while

  IF NOT <condiciones> [ STOP ]

  <instrucciones>

  WHILE

END


Pero vamos a ver el ejemplo siguiendo con esta modalidad de procedimiento.


HOME CLEARSCREEN 


;;;___sucesión fibonacci___;;;


TO proceso_fibonacci :a :b

  IF :a>500 [ STOP ]

  FORWARD :a

  RIGHT 90

  proceso_fibonacci :b :a+:b

END


proceso_fibonacci 1 0   





OTRO EJEMPLO:  


Si escribimos el código que llama la función internamente, en un lugar equivocado...podrían pasar cosas raras como ésta. (se ha invertido el sentido de espiral centrífuga a espiral de centrípeta.) - este no sería u buen código.


HOME POSITION [100, 300] HEADING 90  CLEARSCREEN SHOWTURTLE


;;;___sucesión fibonacci___;;;


TO proceso_fibonacci :a :b

  IF :a>400 [ STOP ]

  proceso_fibonacci :b :a+:b

  FORWARD :a

  RIGHT 90

END


proceso_fibonacci 1 0   


HIDETURTLE 




Intente hacer otros dibujos y programas utilizando la recursividad y la sucesión de Fibonacci 




Los procedimientos en los que la llamada recursiva es la última instrucción que se ejecuta se denominan terminales, de lo contrario, se denominan no terminales.



La declaración condicional, es lo que permite terminar el procedimiento recursivo.

por ejemplo:  

   IF :a>1000 [ STOP ]


Veamos 2 ejemplos típicos de procedimientos recursivos terminales y no terminales:





CLEARSCREEN HIDETURTLE HOME 

PENUP POSITION [100,500] HEADING 0 SHOWTURTLE PENDOWN


;;;___ESPIRAL___;;;


TO subproceso :lado :angulo :increm

  IF :lado>100 [ STOP ]

  FORWARD :lado

  RIGHT :angulo

subproceso :lado+:increm :angulo :increm

END


subproceso 10 10 10  






TO subproceso :rama :angulo :factor

  IF :rama>200 [ STOP ]

  FORWARD :rama

  LEFT :angulo

  subproceso :rama*:factor :angulo :factor

  RIGHT :angulo*2

  subproceso :rama*:factor :angulo :factor

  LEFTt :angulo

  BACK :rama

END


subproceso 2 120 2




Las funciones recursivas son muy expresivas. Es posible escribir en Logo una función de unas pocas líneas que resulte en una oración construida aleatoriamente sobre cualquier gramática generativa.


Estamos acostumbrados a "pensar y actuar" recursivamente, pero no estamos acostumbrados a "describir" procedimientos recursivos. 


P.ej:


Para subir una escalera subo el primer peldaño y luego subo la escalera restante.

para buscar una palabra en el diccionario tomo una palabra al azar, entonces si es menor que la palabra buscada busco la palabra en el bloque de la derecha si es mayor la busco en el bloque de la izquierda si es igual, Lo he encontrado.

un camino de montaña es una curva seguida de un camino de montaña.