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 castellanoPrimitiva en inglés
.ig.eq
.ponElemento.setitem
.ponMP.setbf
.ponPrimero.setfirst
.quizaDevuelve.maybeoutput
abajodown
abiertosallopen
abreActualizaropenupdate
abreAñadiropenappend
abreDialogodialogfileopen
abreEscrituraopenwrite
abreLecturaopenread
abreMidimidiopen
abrePuertoportopen
activasetturtle
activaVentanawindowset
actualizaBotonbuttonupdate
actualizaEstaticostaticupdate
adicionsum
adiosbye
ajustabitfit
altostop
añadeCadenaListboxlistboxaddstring
añadeLineaComboboxcomboboxaddstring
analizaparse
anterior?before?
apagasonidosoundoff
apilapush
aplicaapply
archivopfilep
arcoarc
arco2arc2
arcoElipseellipsearc
arcoelipse2ellipsearc2
arcsenarcsin
areaActivaactivearea
arribaup
asciiPurorawascii
atrapacatch
avfd
avanzaforward
ayudahelp
ayudaDeWindowswinhelp
azarrandom
bajaLapizpendown
bajaLapiz?pendown?
bajaNarizdownpitch
balanceaDerecharightroll
balanceaIzquierdaleftroll
balanceoroll
bdrr
bilr
bitPegabitpaste
bitPegaEnIndicebitpastetoindex
blpd
bnombreserns
boer
boArchivoerf
boPropremprop
borraerase
borraArchivoerasefile
borraBarraDesplazamientoscrollbardelete
borraBotonbuttondelete
borraBotonRadioradiobuttondelete
borraCadenaListboxlistboxdeletestring
borraCheckboxcheckboxdelete
borraComboboxcomboboxdelete
borraDialogodialogdelete
borraEstaticostaticdelete
borraGroupboxgroupboxdelete
borralineaComboboxcomboboxdeletestring
borraListboxlistboxdelete
borraPaletaclearpalette
borraPantallaclearscreen
borraTextocleartext
borraVentanawindowdelete
boton?button?
bovarern
bovarserns
bpcs
bprocserps
bpropserpls
btct
btodoerall
cabeceauppitch
cabeceopitch
cambiaDirchdir
cambiaSignominus
carchar
cargaload
cargaDibbitload
cargaDLLdllload
cargaGifgifload
cascadacascade
cascada.2cascade.2
centrohome
cierraclose
cierraMidimidiclose
cierraPuertoportclose
cierraTodocloseall
ciertotrue
circulocircle
circulo2circle2
clpc
cocientequotient
colorfscreencolor
colorLapizpencolor
combinacombine
contenidocontents
contiene?substring?
coorxxcor
cooryycor
coorzzcor
copiaAreabitcopy
copiaDefcopydef
copiaratonmousecopy
cortaAreabitcut
creaBarraDesplazamientoscrollbarcreate
creaBotonbuttoncreate
creaBotonRadioradiobuttoncreate
creaCheckboxcheckboxcreate
creaComboboxcomboboxcreate
creaDialogodialogcreate
creaDirmkdir
creaEstaticostaticcreate
creaGroupboxgroupboxcreate
creaListboxlistboxcreate
creaVentanawindowcreate
cuentacount
cuentaRepiterepcount
definido?defined?
desapilapop
descoladequeue
desdefor
desplazaashift
desplazaIzquierdalshift
desplazaxscrollx
desplazayscrolly
destapaunbury
destapanombreunburyname
destapatodounburyall
devop
devuelveoutput
dibujalentoslowdraw
diferenciadifference
directorioPadrepopdir
directoriosdirectories
distanciadistance
distanciaxyzdistancexyz
ecodribble
editaedit
editaArchivowindowfileedit
ednombreedn
ednombresedns
edprocsedps
edpropedpl
edpropsedpls
edtodoedall
ejecutarun
ejecutaAnalizarunparse
elementoitem
elementomdmditem
eliminaDirrmdir
elipsa2ellipsa2
elipseellipse
elipse2ellipse2
empiezaPoligonopolystart
enciendesonidosoundon
encolaqueue
encuentrafind
enteroint
entrecomillasquoted
entretejecrossmap
enviaValorAceptaRednetacceptsendvalue
enviaValorConectaRednetconnectsendvalue
espr
escribeprint
escribeBotonRadioradiobuttonset
escribeCadenaPuertoportwritearray
escribeCaracterPuertoportwritechar
escribePuertooutportb
escribePuerto2outport
escriturawriter
esperawait
estadostatus
estadoCheckboxcheckboxget
exclusivonoyield
expandemacromacroexpand
falsofalse
filtrafilter
finend
finlec?eof?
finRednetshutdown
formatoNumeroform
frse
frasesentence
gdrt
gensimbologensym
gilt
giraDerecharight
giraIzquierdaleft
gomapenerase
grosorpensize
guardasave
guardaDialogodialogfilesave
guardaDibbitsave
guardaGifgifsave
guardalsavel
habilitaAceptaRednetaccepton
habilitaBarraDesplazamientoscrollbarenable
habilitaBotonbuttonenable
habilitaBotonRadioradiobuttonenable
habilitaCheckboxcheckboxenable
habilitaComboboxcomboboxenable
habilitaConectaRednetconnecton
habilitaDialogodialogenable
habilitaListboxlistboxenable
habilitaRatonmouseon
habilitaTecladokeyboardon
habilitaVentanawindowenable
haciatowards
haciaXYZtowardsxyz
hastauntil
hazMake
haz.hastado.until
haz.mientrasdo.while
hazlocallocalmake
haztortugamaketurtle
horatime
horaMilitimemilli
ignoraignore
IgnoraMayusculas?caseignoredp
iguales?equal?
imdefprocspops
imdefproppopl
imDefspo
imdefvarpon
impropspopls
imTitulosTodopot
imtodopoall
imtspots
imvarspons
indiceImagenbitindex
inhabilitaAceptaRednetacceptoff
inhabilitaConectaRednetconnectoff
inHabilitaRatonmouseoff
inHabilitaTecladokeyboardoff
iniciaRednetstartup
inviertereverse
invocainvoke
lanzathrow
lapizpen
lapizinicialpennormal
lapizInviertepenreverse
lapizModopenmode
lapizNormalpenpaint
lcrc
lcsrcs
lecturareader
leeBarraDesplazamientoscrollbarget
leeBotonRadioradiobuttonget
leeCadenaPuertoportreadarray
leeCarreadchar
leeCaracterPuertoportreadchar
LeeCarsreadchars
leeFocogetfocus
leeListareadlist
leePalabrareadword
leePuertoinportb
leePuerto2inport
leePuertoJuegoingameport
leeSeleccionListboxlistboxgetselect
leeTeclakeyboardvalue
leetextoComboboxcomboboxgettext
limpiaclean
limpiaPuertoportflush
lInviertepx
listalist
lista?list?
listaArchivosfiles
listaavectorlisttoarray
listanombresnamelist
listaPasostepped
listapropiedadespllist
llrl
llamaDLLdllcall
lNormalppt
loglog10
lprw
lProcsprocedures
lPropPlist
lProp?proplist?
lPropsplists
luzlight
lVarsnames
macro?macrop
maximizaunicon
mayor?greater?
mayorOigual?greaterequal?
mayusculasuppercase
menor?less?
menorOigual?lessequal?
menosPrimerobutfirst
menosPrimerosbutfirsts
menosUltimobutlast
mensajemessagebox
mensajeMidimidimessage
miembromember
miembro?member?
mientraswhile
minimizaicon
minusculaslowercase
modoBitmap?bitmode
modoJaulafence
modoPuertoportmode
modoTortugaturtlemode
modoVentanawindow
modoVueltawrap
mpbf
mprbutfirst
mpsbfs
mubl
muestrashow
muestraPoligonopolyview
muestrattype
muestraTortugast
mulbutlast
nonot
noEconodribble
noExclusivoyield
noIguales?notequal?
nombrename
noPasounstep
norefrescarnorefresh
noTrazauntrace
numero?number?
numeroaureogoldenratio
oor
ocultaTortugaht
ordenasort
orientacionorientation
othideturtle
pass
palabraword
palabra?word?
pantallaGraficafullscreen
pantallaPartidasplitscreen
pantallaTextotextscreen
parato
paracadaforeach
pasostep
patronLapizpenpattern
pausapause
perspectivaperspective
pgfs
pideask
pintaColorfloodcolor
ponAreaActivasetactivearea
ponBalanceosetroll
ponBarraDesplazamientoscrollbarset
ponCabeceosetpitch
ponCFsetsc
ponCheckboxcheckboxset
ponCLsetpc
ponColorFondosetscreencolor
ponColorLapizsetpencolor
ponColorRellenosetfloodcolor
poncrsetfc
ponCursorsetcursor
ponCursorEsperasetcursorwait
ponElementosetitem
ponelementomdmdsetitem
ponEscriturasetwrite
ponFocosetfocus
ponFormabitmapturtle
ponFormaTortuganobitmapturtle
ponGrosorsetpensize
ponIndiceBitsetbitindex
ponlapizsetpen
ponLecturasetread
ponLupazoom
ponLuzsetlight
ponMargenessetmargins
ponModobitsetbitmode
ponModoTortugasetturtlemode
ponorientacionsetorientation
ponPatronLapizsetpenpattern
ponPixelsetpixel
ponPossetpos
ponPosEscriturasetwritepos
ponPosLecturasetreadpos
ponPrimerofput
ponpropPprop
ponrseth
ponRonzalsetscrunch
ponRumbosetheading
ponTemporizadorsettimer
pontextoComboboxcomboboxsettext
ponTiposetlabelfont
ponUltimolput
ponXsetx
ponXYsetxy
ponXYZsetxyz
ponYsety
ponZsetz
pos3dposxyz
posicionatesetposxyz
posLecturawritepos
posRatonmousepos
potenciapower
ppfput
preguntaBoxquestionbox
prifirst
primerofirst
primerosfirsts
primitiva?primitive?
procedimiento?procedure?
productoproduct
propiedadgprop
pruebatest
ptts
pullput
quienturtle
quitaremove
quitaDLLdllfree
quitaEstadonostatus
quitarepetidosremdup
radarcSenradarcsin
radSenradsin
raizcuadradasqrt
rcsqrt
rebk
reAzarrerandom
recibeValorAceptaRednetacceptreceivevalue
recibeValorConectaRednetconnectreceivevalue
rectanguloRellenobitblock
redondearound
refrescarefresh
rellenafill
repiterepeat
restanterest
restoremainder
resultadoEjecutarunresult
retrocedeback
ronzalscrunch
rotulolabel
rotuloTamlabelsize
rumboheading
sacaalazarpick
secentiseq
secracrseq
seleccionBoxselectbox
sensin
setCursorNoEsperasetcursornowait
siif
siciertoiftrue
siempreforever
siEventoeventcheck
siFalsoiffalse
signosign
siguecontinue
siNoBoxyesnobox
siSinoifelse
sistemamachine
slpu
subeLapizpenup
suenasound
suenaWaveplaywave
tamañoCargaDibbitloadsize
tamañoDibujobitsize
tamañoGifgifsize
tapabury
tapadoburied
tapatodoburyall
tapavarburyname
tecla?key?
tejemap
teje.frmap.se
temporizadorACerocleartimer
terminaPoligonopolyend
textotext
textoCompletofulltext
tieneBarra?backslashed?
tipolabelfont
tiposDeLetrafontfacenames
tipotextotextfont
tonotone
tortugasturtles
transfieretransfer
trazatrace
trazadostraced
ullast
ultimolast
vacio?empty?
valorthing
var?name?
vectorarray
vector?array?
vectoralistaarraytolist
vectormdmdarray
ventanaDepuradordebugwindows
versionLogologoversion
visible?shown?
yand

La página de descargas en Sourceforge tiene disponible los ejecutables así como el código fuente de la última versión 6.32.