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 print
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.