Cuando escribí sobre LogoWriter, me apeteció investigar un poco más en detalle sobre la situación actual de Logo, un lenguaje que intuyo está en peligro de extinción.
El último contacto que tuve, fue con el español WinLogo de Idea I+D para Windows 3.x, y DOS con una magnífica interfaz gráfica de usuario, así que tras ir buscando, me topé con FMSLogo, una versión de Logo para Win32, con muchas y novedosas características:
– Gestión de excepciones.
– Soporte de TCP/IP.
– Manejo de hasta 1024 tortugas independientes.
– Interacción con dispositivos MIDI.
– Integración Windows (llamadas a DLL, creación de ventanas, y diálogos).
– Capacidades multimedia (WAV, CD-ROM, …).
– Funciones de dibujo 3D.
– …
Es gratuito y de código abierto, siendo a partir de 2005, el heredero de Microsoft Windows Logo (MSWLogo). Es además terriblemente compacto con apenas 2 Mb. de espacio en disco incluyendo ayuda y ejemplos; consumiendo del orden de 8 Mb. de memoria RAM. Entre los ejemplos se incluyen intérpretes de Pascal y Basic, o el impresionante Asteroid Miner (24,1 Kb. en formato ZIP).
Todo lo anterior, lo hace ideal para el aprendizaje de niños, que no necesitarán el último hardware disponible para usarlo.
Sin embargo, sigue siendo un lenguaje interpretado, como lo era en los 80, lo que lo inevitablemente lo deja corto una vez lo dominemos. Además está escrito en Borland C++, lo que limita su futura evolución a una herramienta obsoleta. No obstante, existe una beta que utiliza wxWidgets con GCC, que una vez solucione los problemas y carencias actuales, permitirá que FMSLogo esté disponible para otras plataformas y arquitecturas.
Su intérprete, está basado en el UCBLogo (Berkeley Logo), pero en una versión de principios de 2000, no es grave, pues tan poco es que haya sufrido demasiados cambios, pero si un freno que espero que George Mills sea capaz de superar.
El entorno está totalmente traducido al castellano, incluyendo los mensajes de error, pero no así la ayuda. Lo que más me ha gustado, son las primitivas, donde podemos usar sus versiones en castellano como derecha 90, o en inglés right 90, lo que va a permitirnos portar programas que tuviéramos con bastante rapidez.
Un detalle de agradecer, y que me ha resultado interesante también, es el capítulo de la ayuda destinado a mostrar las equivalencias entre primitivas en castellano, que eran con las que estaba familiarizado, y las versiones en inglés. Un punto muy a tener en cuenta para que los niños empiecen no sólo a programar, sino a manejarse con el inglés.
Primitiva en castellano | Primitiva en inglés |
.ig | .eq |
.ponElemento | .setitem |
.ponMP | .setbf |
.ponPrimero | .setfirst |
.quizaDevuelve | .maybeoutput |
abajo | down |
abiertos | allopen |
abreActualizar | openupdate |
abreAñadir | openappend |
abreDialogo | dialogfileopen |
abreEscritura | openwrite |
abreLectura | openread |
abreMidi | midiopen |
abrePuerto | portopen |
activa | setturtle |
activaVentana | windowset |
actualizaBoton | buttonupdate |
actualizaEstatico | staticupdate |
adicion | sum |
adios | bye |
ajusta | bitfit |
alto | stop |
añadeCadenaListbox | listboxaddstring |
añadeLineaCombobox | comboboxaddstring |
analiza | parse |
anterior? | before? |
apagasonido | soundoff |
apila | push |
aplica | apply |
archivop | filep |
arco | arc |
arco2 | arc2 |
arcoElipse | ellipsearc |
arcoelipse2 | ellipsearc2 |
arcsen | arcsin |
areaActiva | activearea |
arriba | up |
asciiPuro | rawascii |
atrapa | catch |
av | fd |
avanza | forward |
ayuda | help |
ayudaDeWindows | winhelp |
azar | random |
bajaLapiz | pendown |
bajaLapiz? | pendown? |
bajaNariz | downpitch |
balanceaDerecha | rightroll |
balanceaIzquierda | leftroll |
balanceo | roll |
bd | rr |
bi | lr |
bitPega | bitpaste |
bitPegaEnIndice | bitpastetoindex |
bl | pd |
bnombres | erns |
bo | er |
boArchivo | erf |
boProp | remprop |
borra | erase |
borraArchivo | erasefile |
borraBarraDesplazamiento | scrollbardelete |
borraBoton | buttondelete |
borraBotonRadio | radiobuttondelete |
borraCadenaListbox | listboxdeletestring |
borraCheckbox | checkboxdelete |
borraCombobox | comboboxdelete |
borraDialogo | dialogdelete |
borraEstatico | staticdelete |
borraGroupbox | groupboxdelete |
borralineaCombobox | comboboxdeletestring |
borraListbox | listboxdelete |
borraPaleta | clearpalette |
borraPantalla | clearscreen |
borraTexto | cleartext |
borraVentana | windowdelete |
boton? | button? |
bovar | ern |
bovars | erns |
bp | cs |
bprocs | erps |
bprops | erpls |
bt | ct |
btodo | erall |
cabecea | uppitch |
cabeceo | pitch |
cambiaDir | chdir |
cambiaSigno | minus |
car | char |
carga | load |
cargaDib | bitload |
cargaDLL | dllload |
cargaGif | gifload |
cascada | cascade |
cascada.2 | cascade.2 |
centro | home |
cierra | close |
cierraMidi | midiclose |
cierraPuerto | portclose |
cierraTodo | closeall |
cierto | true |
circulo | circle |
circulo2 | circle2 |
cl | pc |
cociente | quotient |
colorf | screencolor |
colorLapiz | pencolor |
combina | combine |
contenido | contents |
contiene? | substring? |
coorx | xcor |
coory | ycor |
coorz | zcor |
copiaArea | bitcopy |
copiaDef | copydef |
copiaraton | mousecopy |
cortaArea | bitcut |
creaBarraDesplazamiento | scrollbarcreate |
creaBoton | buttoncreate |
creaBotonRadio | radiobuttoncreate |
creaCheckbox | checkboxcreate |
creaCombobox | comboboxcreate |
creaDialogo | dialogcreate |
creaDir | mkdir |
creaEstatico | staticcreate |
creaGroupbox | groupboxcreate |
creaListbox | listboxcreate |
creaVentana | windowcreate |
cuenta | count |
cuentaRepite | repcount |
definido? | defined? |
desapila | pop |
descola | dequeue |
desde | for |
desplaza | ashift |
desplazaIzquierda | lshift |
desplazax | scrollx |
desplazay | scrolly |
destapa | unbury |
destapanombre | unburyname |
destapatodo | unburyall |
dev | op |
devuelve | output |
dibujalento | slowdraw |
diferencia | difference |
directorioPadre | popdir |
directorios | directories |
distancia | distance |
distanciaxyz | distancexyz |
eco | dribble |
edita | edit |
editaArchivo | windowfileedit |
ednombre | edn |
ednombres | edns |
edprocs | edps |
edprop | edpl |
edprops | edpls |
edtodo | edall |
ejecuta | run |
ejecutaAnaliza | runparse |
elemento | item |
elementomd | mditem |
eliminaDir | rmdir |
elipsa2 | ellipsa2 |
elipse | ellipse |
elipse2 | ellipse2 |
empiezaPoligono | polystart |
enciendesonido | soundon |
encola | queue |
encuentra | find |
entero | int |
entrecomillas | quoted |
entreteje | crossmap |
enviaValorAceptaRed | netacceptsendvalue |
enviaValorConectaRed | netconnectsendvalue |
es | pr |
escribe | |
escribeBotonRadio | radiobuttonset |
escribeCadenaPuerto | portwritearray |
escribeCaracterPuerto | portwritechar |
escribePuerto | outportb |
escribePuerto2 | outport |
escritura | writer |
espera | wait |
estado | status |
estadoCheckbox | checkboxget |
exclusivo | noyield |
expandemacro | macroexpand |
falso | false |
filtra | filter |
fin | end |
finlec? | eof? |
finRed | netshutdown |
formatoNumero | form |
fr | se |
frase | sentence |
gd | rt |
gensimbolo | gensym |
gi | lt |
giraDerecha | right |
giraIzquierda | left |
goma | penerase |
grosor | pensize |
guarda | save |
guardaDialogo | dialogfilesave |
guardaDib | bitsave |
guardaGif | gifsave |
guardal | savel |
habilitaAceptaRed | netaccepton |
habilitaBarraDesplazamiento | scrollbarenable |
habilitaBoton | buttonenable |
habilitaBotonRadio | radiobuttonenable |
habilitaCheckbox | checkboxenable |
habilitaCombobox | comboboxenable |
habilitaConectaRed | netconnecton |
habilitaDialogo | dialogenable |
habilitaListbox | listboxenable |
habilitaRaton | mouseon |
habilitaTeclado | keyboardon |
habilitaVentana | windowenable |
hacia | towards |
haciaXYZ | towardsxyz |
hasta | until |
haz | Make |
haz.hasta | do.until |
haz.mientras | do.while |
hazlocal | localmake |
haztortuga | maketurtle |
hora | time |
horaMili | timemilli |
ignora | ignore |
IgnoraMayusculas? | caseignoredp |
iguales? | equal? |
imdefprocs | pops |
imdefprop | popl |
imDefs | po |
imdefvar | pon |
improps | popls |
imTitulosTodo | pot |
imtodo | poall |
imts | pots |
imvars | pons |
indiceImagen | bitindex |
inhabilitaAceptaRed | netacceptoff |
inhabilitaConectaRed | netconnectoff |
inHabilitaRaton | mouseoff |
inHabilitaTeclado | keyboardoff |
iniciaRed | netstartup |
invierte | reverse |
invoca | invoke |
lanza | throw |
lapiz | pen |
lapizinicial | pennormal |
lapizInvierte | penreverse |
lapizModo | penmode |
lapizNormal | penpaint |
lc | rc |
lcs | rcs |
lectura | reader |
leeBarraDesplazamiento | scrollbarget |
leeBotonRadio | radiobuttonget |
leeCadenaPuerto | portreadarray |
leeCar | readchar |
leeCaracterPuerto | portreadchar |
LeeCars | readchars |
leeFoco | getfocus |
leeLista | readlist |
leePalabra | readword |
leePuerto | inportb |
leePuerto2 | inport |
leePuertoJuego | ingameport |
leeSeleccionListbox | listboxgetselect |
leeTecla | keyboardvalue |
leetextoCombobox | comboboxgettext |
limpia | clean |
limpiaPuerto | portflush |
lInvierte | px |
lista | list |
lista? | list? |
listaArchivos | files |
listaavector | listtoarray |
listanombres | namelist |
listaPaso | stepped |
listapropiedades | pllist |
ll | rl |
llamaDLL | dllcall |
lNormal | ppt |
log | log10 |
lp | rw |
lProcs | procedures |
lProp | Plist |
lProp? | proplist? |
lProps | plists |
luz | light |
lVars | names |
macro? | macrop |
maximiza | unicon |
mayor? | greater? |
mayorOigual? | greaterequal? |
mayusculas | uppercase |
menor? | less? |
menorOigual? | lessequal? |
menosPrimero | butfirst |
menosPrimeros | butfirsts |
menosUltimo | butlast |
mensaje | messagebox |
mensajeMidi | midimessage |
miembro | member |
miembro? | member? |
mientras | while |
minimiza | icon |
minusculas | lowercase |
modoBitmap? | bitmode |
modoJaula | fence |
modoPuerto | portmode |
modoTortuga | turtlemode |
modoVentana | window |
modoVuelta | wrap |
mp | bf |
mpr | butfirst |
mps | bfs |
mu | bl |
muestra | show |
muestraPoligono | polyview |
muestrat | type |
muestraTortuga | st |
mul | butlast |
no | not |
noEco | nodribble |
noExclusivo | yield |
noIguales? | notequal? |
nombre | name |
noPaso | unstep |
norefrescar | norefresh |
noTraza | untrace |
numero? | number? |
numeroaureo | goldenratio |
o | or |
ocultaTortuga | ht |
ordena | sort |
orientacion | orientation |
ot | hideturtle |
pa | ss |
palabra | word |
palabra? | word? |
pantallaGrafica | fullscreen |
pantallaPartida | splitscreen |
pantallaTexto | textscreen |
para | to |
paracada | foreach |
paso | step |
patronLapiz | penpattern |
pausa | pause |
perspectiva | perspective |
pg | fs |
pide | ask |
pintaColor | floodcolor |
ponAreaActiva | setactivearea |
ponBalanceo | setroll |
ponBarraDesplazamiento | scrollbarset |
ponCabeceo | setpitch |
ponCF | setsc |
ponCheckbox | checkboxset |
ponCL | setpc |
ponColorFondo | setscreencolor |
ponColorLapiz | setpencolor |
ponColorRelleno | setfloodcolor |
poncr | setfc |
ponCursor | setcursor |
ponCursorEspera | setcursorwait |
ponElemento | setitem |
ponelementomd | mdsetitem |
ponEscritura | setwrite |
ponFoco | setfocus |
ponForma | bitmapturtle |
ponFormaTortuga | nobitmapturtle |
ponGrosor | setpensize |
ponIndiceBit | setbitindex |
ponlapiz | setpen |
ponLectura | setread |
ponLupa | zoom |
ponLuz | setlight |
ponMargenes | setmargins |
ponModobit | setbitmode |
ponModoTortuga | setturtlemode |
ponorientacion | setorientation |
ponPatronLapiz | setpenpattern |
ponPixel | setpixel |
ponPos | setpos |
ponPosEscritura | setwritepos |
ponPosLectura | setreadpos |
ponPrimero | fput |
ponprop | Pprop |
ponr | seth |
ponRonzal | setscrunch |
ponRumbo | setheading |
ponTemporizador | settimer |
pontextoCombobox | comboboxsettext |
ponTipo | setlabelfont |
ponUltimo | lput |
ponX | setx |
ponXY | setxy |
ponXYZ | setxyz |
ponY | sety |
ponZ | setz |
pos3d | posxyz |
posicionate | setposxyz |
posLectura | writepos |
posRaton | mousepos |
potencia | power |
pp | fput |
preguntaBox | questionbox |
pri | first |
primero | first |
primeros | firsts |
primitiva? | primitive? |
procedimiento? | procedure? |
producto | product |
propiedad | gprop |
prueba | test |
pt | ts |
pul | lput |
quien | turtle |
quita | remove |
quitaDLL | dllfree |
quitaEstado | nostatus |
quitarepetidos | remdup |
radarcSen | radarcsin |
radSen | radsin |
raizcuadrada | sqrt |
rc | sqrt |
re | bk |
reAzar | rerandom |
recibeValorAceptaRed | netacceptreceivevalue |
recibeValorConectaRed | netconnectreceivevalue |
rectanguloRelleno | bitblock |
redondea | round |
refresca | refresh |
rellena | fill |
repite | repeat |
restante | rest |
resto | remainder |
resultadoEjecuta | runresult |
retrocede | back |
ronzal | scrunch |
rotulo | label |
rotuloTam | labelsize |
rumbo | heading |
sacaalazar | pick |
secent | iseq |
secrac | rseq |
seleccionBox | selectbox |
sen | sin |
setCursorNoEspera | setcursornowait |
si | if |
sicierto | iftrue |
siempre | forever |
siEvento | eventcheck |
siFalso | iffalse |
signo | sign |
sigue | continue |
siNoBox | yesnobox |
siSino | ifelse |
sistema | machine |
sl | pu |
subeLapiz | penup |
suena | sound |
suenaWave | playwave |
tamañoCargaDib | bitloadsize |
tamañoDibujo | bitsize |
tamañoGif | gifsize |
tapa | bury |
tapado | buried |
tapatodo | buryall |
tapavar | buryname |
tecla? | key? |
teje | map |
teje.fr | map.se |
temporizadorACero | cleartimer |
terminaPoligono | polyend |
texto | text |
textoCompleto | fulltext |
tieneBarra? | backslashed? |
tipo | labelfont |
tiposDeLetra | fontfacenames |
tipotexto | textfont |
tono | tone |
tortugas | turtles |
transfiere | transfer |
traza | trace |
trazados | traced |
ul | last |
ultimo | last |
vacio? | empty? |
valor | thing |
var? | name? |
vector | array |
vector? | array? |
vectoralista | arraytolist |
vectormd | mdarray |
ventanaDepurador | debugwindows |
versionLogo | logoversion |
visible? | shown? |
y | and |
La página de descargas en Sourceforge tiene disponible los ejecutables así como el código fuente de la última versión 6.32.