Logo Computer Systems Inc, más conocidos como LCSI, fue fundada en el año 1981 por Seymour Papert, el inventor en 1968 del lenguaje Logo.

No es de extrañar en programaran Apple Logo, y el IBM Personal Logo de 1983, que al final acabaría siendo LogoWriter.

Aunque empecé con Sinclair Logo, y después pasaría a Logo SB de los españoles Software de base, admito que LogoWriter fue el intérprete de más avanzado de lenguaje Logo en aquella época.



Estaba disponible en 4 idiomas: inglés, francés, portugués y castellano; lo que debido a las particularidades del lenguaje no incluía solamente el entorno de programa, sino también las primitivas del lenguaje usando por ejemplo adelante en vez de forward. Se hicieron variantes que aprovechaban el adaptador gráfico del que dispusiéramos, ya fuera CGA (4 colores), EGA (16 colores), o VGA (256 colores).

Hasta 1988 con la versión 2.01 para DOS, siguieron en franca superioridad tecnológica, y una loable eficiencia, pues pese a la cantidad de primitivas disponibles, el ejecutable del programa eran solamente 57 Kb.

A partir de ahí, irían estancándose hasta que por fin en 1993 lanzarían MicroMundos (MicroWorlds, una versión con intefaz gráfica para DOS y MacOS, y que posteriormente añadiría una versión Windows. En la actualidad, MicroMundos Ex, ofrece por ejemplo un entorno basado en Logo con multitarea y ejecución paralela.

La siguiente lista que encontré en mi ordenador, es un inventario de las primitivas que soportaba el LogoWriter 2 de 1987, y que en gran medida nos dan una idea de la gran potencia que ya tenía.

ComandoDescripción
*Operador de multiplicación
+Operador de suma
Operador de resta
.dentro 
.deposita 
.examina 
.fuera 
.primitivasResponde la lista de primitivas
.versionResponde la versión de Logo Writer actual
/Operador “dividir”
<Operador “menor que”
=Operador “igual a”
>Operador “mayor que”
activa ([lista de procedimientos])Ejecuta el o los procedimientos, ordenes ó cálculos indicados en su argumento
adelante, ad (número)La tortuga adelanta los pasos indicados en el argumento
altoDetiene un procedimiento
altotodoDetiene un procedimiento y todos los procedimientos que lo contienen
anotadorReporta una lista con el texto “cortado” o “copiado” almacenado en el “buffer” de memoria
arctan (a/b)Responde el ángulo correspondiente a un triángulo rectángulo de catetos a, b
ascii (“carácter)Responde el número ASCII del carácter indicado en su argumento
atras, at (número)La o las tortugas activas retroceden el número de pasos indicado en el argumento
azar (número)Responde un número al azar entre 0 y el número indicado menos 1
beventosBorra los eventos definidos
bgBorra los gráficos
bmBorra los mandos
bnombre (“nom)Borra la variable del nombre indicado
bnombresBorra todas las variables
borraSuprime el caracter debajo del cursor
boton?Responde cierto si el botón del Joystick ha sido pulsado
bpag (“pag)Borra una página
btBorra el texto
busca (“pal)Busca la palabra indicada
butilesBorra los útiles cargados
cada ([lista de acciones])Cada una de las tortugas ejecuta las acciones indicadas.
Por ejemplo: CADA [FCOLOR QUIEN * 2]
cambiadir (“dir) 
car (número)Reporta el caracter correspondiente al código ASCII indicado en el argumento
cardebajoReporta el caracter “texto” debajo de la tortuga
cardebajocursorReporta el caracter “texto” debajo del cursor
carga (“página)Carga en el revés de la página actual los programas de la página indicada en su argumento
cargadib (“dib)Carga el gráfico del nombre indicado guardado con GUARDADIB
cargatexto (“texto)Carga el texto del nombre indicado guardado con GUARDATEXTO o con cualquier formato ASCII de otros programas
cierraCierra una página para impedir que sea borrada
colorResponde el color de la o las tortugas activas
colordebajoResponde el color debajo de la tortuga activa
colorfResponde el color del fondo
colortextoResponde el color del texto
contenidoAbandona la página
coorxReporta el valor de la coordenada X de la tortuga activa. En caso de haber más de una tortuga activa, responde la coordenada de la de menor número
cooryIdem coorx, con la coordenada Y
copiaCopia un texto seleccionado
copiaarch (“discoorigen\dir\nomarchivo) (“discodestino\dir\nomarchivo) 
cortaCorta un texto seleccionado
cos (angulo)Responde el coseno del ángulo indicado
cosa (“nombre.de.una.variable)Responde el valor de la variable indicada, si esta existiese
cpCon pluma
creadir (“nombre.directorio)Crea un directorio con el nombre indicado dentro del directorio activo
cuabCursor abajo. El cursor del texto baja una línea
cuadCursor adelante. El cursor del texto adelanta un espacio
cuando (“letra) ([lista de acciones])Permite definir un “macro”, de manera que al pulsarse CTRL y la letra indicada se ejecuta la lista de acciones.
cuarCursor arriba. El cursor del texto sube una línea
cuatCursor atrás. El cursor del texto retrocede un espacio
cuenta (“palabra o [lista])Responde el número de caracteres de la palabra indicada o el número de palabras de una lista
da (“nom.var) (valor)Define una variable con el nombre indicado en el primer argumento con el valor del segundo argumento
davueltaDa vuelta la página
derecha, de (número)La tortuga gira a la derecha el número de grados indicado
dejapagAbandona la página sin definir los cambios efectuados
descierraAnula el efecto del comando CIERRA
desmarcaDesmarca un texto seleccionado
dile (número [lista de números])Activa a la o las tortugas indicadas
diractualResponde el directorio actual
directoriosResponde los directorios incluídos en el directorio actual
discoResponde el disco activo
distancia ([x y])Responde la distancia entre la tortuga activa y el punto indicado
dosSale al DOS
elarch, eliminara (“nomarch.ext)Elimina el archivo indicado. Debe especificarse la extensión del mismo)
eliminadir (“nomdirectorio)Elimina el directorio indicado
eliminapag, elpag (“nompag)Elimina la página indicada
encontrado?Responde cierto si el comando busca encuentra la palabra indicada en su argumento y falso si no lo hace
entero (“número)Reporta la parte entera del número
escribe, es (“palabra o [lista])Escribe el argumento y el cursor pasa a la línea siguiente
esnombresEscribe los nombres de las variables existentes
espacioReporta el espacio libre de la página
espaciod 
espera (número)Detiene la acción durante un lapso de tiempo determinado por su argumento. 100 es aproximadamente 5 segundos.
estampaEstampa la figura de la tortuga activa
etEsconde la tortuga
fcolor (número)Fija el color de la tortuga
fcolorf (número)Fija el color del fondo
fcolortexto (número)Fija el color de un texto cuando éste está seleccionado con F1 o dentro de un programa lo que se escriba con el comando ES
fcomaEn los decimales reemplaza el punto decimal por la coma
fdisco (“letra)Activa el drive indicado
fdlFin de línea. Lleva el cursor de texto al final de la línea
ffig (“número)Fija en la o las tortugas activas, el número de figura indicado
figReporta el número de la figura de la tortuga activa
figurasTrae la página de figuras
finpagFin de página. Lleva el cursor de texto al final de la página
fpos ([x y])Lleva a la tortuga activa al punto indicado por las coordenadas
fpostexto (número)Lleva el cursor del texto a la posición indicada por número
fpuntoEn los decimales reemplaza la coma decimal por el punto
frase, fr (argu1 argu2)Reporta una frase formada por los argumentos indicados dentro de los corchetes. Estos pueden obviarse si sólo hay dos argumentos
frente?Responde cierto si se está en el frente de la página
frumbo (número)Fija el rumbo de la tortuga activa
fx (coorx)Fija la tortuga activa en la coordenada X indicada
fy (número)Fija la tortuga activa en la coordenada Y indicada
guardadib (“nomdib)Guarda el dibujo de la pantalla con el nombre indicado
guardapag (“nompag)Guarda la página con el nombre indicado
guardatexto (“nomtexto)Guarda el texto de la página (frente o revés) con el nombre indicado
hacia ([x y])Reporta el rumbo a colocar a la tortuga para que mire el punto indicado. Se usa con el mando FRUMBO.
Por ejemplo: FRUMBO HACIA [90 54]
hazlista (argu1) (argu2)
identico? (argu1) (argu2)Reporta cierto si el argumento 1 es igual al argumento 2
igual? (argu1) (argu2)Reporta cierto si el argumento 1 es igual al argumento 2
imppantImprime la pantalla en el modo gráfico
imptextoImprime la pantalla en el modo texto
imptexto80Idem imptexto pero en 80 columnas
incm,
insertacm (“texto)
Inserta centro mandos. Inserta el texto indicado en la zona de mandos
inserta (“texto)Escribe el texto indicado pero el cursor no baja a la línea siguiente
item (número) (palabra ó lista)Reporta el elemento de orden, número de la palabra o lista indicada
izquierda, iz (número)Gira el ángulo indicado en el número a la izquierda
leecarLee y reporta un caracter del teclado
leelistaLee y reporta una lista de caracteres o palabras del teclado
leelistacmLee y reporta una lista de caracteres o palabras del teclado desde la zona de mandos
limpiaLimpia la pantalla gráfica pero sin modificar la posición y el rumbo de la tortuga
lista (argu1) (argu2)Forma y reporta una lista formada por los argumentos
lista? (“argu1)Reporta cierto si el argumento es una lista
listaarchReporta la lista de todos los archivos del directorio activo
listapagReporta la lista de páginas del directorio activo
listautilesReporta la lista de útiles cargados
llLeelista. Lee y reporta una lista del teclado
llcmLeelista centro mandos. Lee y reporta una lista del teclado pero desde el centro de mandos
longtextoReporta la longitud del texto desde el principio hasta el final
marcaIndica el comienzo de selección de un texto
marcadoReporta el texto marcado
menos (número)Reporta el número indicado con el signo cambiado.
menosprimero, mpr (argumento)Reporta el argumento indicado sin el primer elemento
menosultimo, mul (argumento)Reporta el argumento indicado sin el último elemento
miembro? (argu1) (argu2)Reporta cierto si el argumento 1 pertenece al argumento 2
mtMuestra tortuga
muestra (texto)Escribe el texto indicado en la zona de mandos
muestranombres, mnEscribe los nombres y los valores de las variables definidas en la zona de mandos
no (comparación)Responde falso si la comparación es cierta y cierto si ésta es falsa
nombra (valor) (nombre de la variable)Define una variable con el valor indicado en el primer argumento. Es similar a DA
nombrapag, np (“nompag)Nombra a la página actual
nombre? (“palabra)Responde cierto si la palabra indicada es una variable
nuevapagAbandona la página actual y trae una nueva página
número? (argu)Responde cierto si el argumento es un número
(o comparación1 comparación2 …)Disyuntivo lógico. Responde cierto si al menos una de las comparaciones es cierta
origenLleva la tortuga al centro con rumbo 0
palabra (“pal1 “pal2 …)Forma una palabra “pegando” sus argumentos)
palabra? (“pal)Reporta cierto si su argumento es una palabra
paleta (n)Responde el valor del joystick indicado en n
pantprev 
pantsig 
para (nombre)Indica que comienza un programa con el nombre indicado
pbPluma de borrar
pdlPrincipio de línea. lleva el cursor del texto al principio de la línea
pegaPega un texto copiado o “cortado”
piPluma inversa
pide (num.tortuga) [lista de acciones]Fuerza a la tortuga o a las tortugas indicadas que realicen las acciones especificadas en el segundo argumento
pintaRellena una superficie cerrada con el color activo
ponprimero, ppr (argu1) ([lista])Forma y reporta una lista con argu1 en primer lugar.
Ejemplo:
ESCRIBE PONPRIMERO 12 [30 56]
[12 30 56]
ponultimo, pul (argu1) ([lista])Forma y reporta una lista con argu1 en último lugar.
Ejemplo:
ESCRIBE PONULTIMO 12 [30 56]
[30 56 12]
posReporta la lista de coordenadas X Y de la tortuga activa
poscursorReporta la posición del cursor de texto en el sistema cartesiano
postextoReporta la posición del cursor de texto tomando como 0 el principio de la página
primero, pr (argumento)Primero. Reporta el primer elemento del argumento
prinpagLleva el cursor de texto al principio de la página
quienReporta el número de la tortuga activa
rc (número)Reporta la raíz cuadrada del número
reporta, reDentro de un programa permite que éste reporte un valor.
Ejemplo:
PARA duplo :num
RE :num * 2
FIN
reciclaRecupera la memoria ocupada
recobraRecobra la página en su estado anterior, perdiéndose los cambios
redondeo (número)Si el argumento numérico es un número decimal, y la parte decimal es menor que 0,5 redondea hacia “abajo”. En caso contrario redondea hacia arriba
reemplaza (argu1) (argu2)Reemplaza el argumento 1 por el argumento 2
renombra (nom1) (nom2)Permite renombrar un archivo
repite (número) [lista de acciones] 
resto (número 1) (número 2)Reporta el resto del cociente entre el número 1 y el número 2
rgRestaura gráficos. Borra la pantalla y la tortuga adopta su forma y color inicial
rotulo (texto)El texto indicado se escribe en la pantalla en modo “gráfico” a partir de la posición de la tortuga
rumboReporta el rumbo de la tortuga activa
sen (ángulo)Reporta el seno del ángulo indicado
si (comparación) [lista de acciones]Condicional simple. Si la comparación es cierta se ejecuta la lista de acciones
siotro (comparación) [lista 1 de acciones][lista 2 de acciones]Condicional doble. Si la comparación es cierta se ejecuta la lista 1 de acciones y si es falsa la lista 2 de acciones
sombreaRellena una superficie cerrada con la “figura” de la tortuga activa
spSin pluma
tabDesplaza al cursor de texto hasta la próxima estación de tabulación. Estas están ubicadas cada 10 caracteres
tecla?Reporta cierto si una tecla es pulsada
todasReporta una lista con los números de las cuatro tortugas
tono (número 1) (número 2)Toca un sonido con la frecuencia indicada en su primer argumento y con la duración especificada por el segundo.
tortugalentaFuerza a la tortuga a trabajar “lentamente”.
tortugarapidaDevuelve a la tortuga su velocidad “normal”.
traepag, tp (“nombre)Trae la página del nombre indicado
traefigsCarga las figuras del directorio y disco activos
traeutiles (“nompag)Instala los programas de la página indicada en la página activa pero en forma “oculta”
ultimo, ul (argu)Reporta el último elemento del argumento
unespacio 
vacia? (argu)Reporta cierto si el argumento está vacío
(y comparación1 comparación2 …)Conjuntivo lógico. Responde cierto si todas las comparaciones son ciertas