Você está na página 1de 4

Boo DESARROLLO

UNA HISTORIA DE FANTASMAS


Boo es un lenguaje de script diseado para Mono y .NET. Esta extraa mezcla de Python y C# podra ser justo lo que se necesita para comenzar con la plataforma .NET. POR TIM SCHRMANN
odrigo Barreto de Oliveira estaba frustrado; no poda encontrar un lenguaje de programacin que fuera adecuado para su prximo proyecto. Python no posea la clase de comprobacin de tipos estticos que necesitaba y no tena una buena integracin con .NET. C# estaba bien integrado con .NET, pero requera demasiadas comprobaciones de tipos. Estos inconvenientes le llevaron a desarrollar su propio lenguaje de script. Se basara en Python y dependera de CLI (Common Language Infrastructure) en el marco Dotnet. El resultado lo ali con un poco de C# y con los principios de diseo de Ruby, y finalmente obtuvo el lenguaje orientado a objetos Boo [1], disponible para Linux gracias al entorno Mono.

Exploracin del Lenguaje de Script Boo

Despedida
Como el tpico Hola Mundo con su lnea print(Hola Mundo) es tan trivial, el Listado 1 proporciona una variante en GTK#. Boo no encierra simplemente bloques de cdigo continuos entre llaves, sino que utiliza el sangrado, del mismo modo que lo hace Python. De hecho, ni siquiera se permite escribir end para finalizar un bloque. Tampoco utiliza los puntos y comas para finalizar las sentencias, que slo deberan utilizarse para resolver las ambigedades. Por otro lado, Boo soporta los dos tipos de comentarios de Python, los que comienzan por # y los tpicos de C y C++, /* y //. @ZT:Variables Al contrario que Python, Boo utiliza tipos estticos; es decir, hay que establecer el tipo de una variable antes de utilizarla por primera vez. Una ventaja de

esta solucin es que el compilador detectar las asignaciones incorrectas en tiempo de compilacin y se quejar de ello. Para evitar que los programadores se tengan que pelear con los tipos de datos, el compilador inteligente de Boo automticamente derivar el tipo

Listado 1: Hola GTK#


01 import Gtk 02 03 Application.Init() 04 window = Window(Hola Mundo, DefaultWidth: 300, DefaultHeight: 200) 05 06 window.DeleteEvent += def(): 07 Application.Quit () 08 09 window.ShowAll() 10 Application.Run()

WWW.LINUX- MAGAZINE.ES

Nmero 25

53

DESARROLLO Boo

o bien utilizar una notacin reducida:


a=[1,2,3,4, cinco] print(a[:3])

Hoy Cerramos
Boo incluso permite la definicin de una funcin dentro de otra:
def outer(): inner = def(): print(inner ha U sido llamada) inner() outer()

range() es una funcin interna que proporciona valores dentro de un rango dado. Como muestra el ejemplo, es posible mezclar tipos dentro de una lista. En Boo, la abreviatura usada en el comando print se denomina operacin de troceado; en este caso, devuelve los Figura 1: El sitio web del proyecto Boo proporciona fragmentos tres primeros valores de de cdigo y una introduccin muy til al lenguaje Boo. a. Boo tambin soporta las expresiones regulacorrecto en un proceso conocido como res, incluyendo el operador de corresinferencia de tipos: pondencia (=~):
a as int // a es un entero a= 3 b=a print b ejemplo= Esto es un test if ejemplo=~ @/te.t/: print(contenido)

Esta tcnica est a un paso de los cierres. De nuevo, Boo toma este concepto de la programacin funcional. Un cierre o bloque es una porcin de cdigo o el cuerpo de una funcin donde las variables locales de la funcin que las encierra son visibles, y por tanto pueden usarse. Boo soporta dos formas sintcticamente diferentes: la sintaxis basada en bloques, como la del ejemplo que acaba-

Compilacin
Existen tres opciones para ejecutar los scripts de Boo. Independientemente de la que se elija, antes de comenzar habr que instalar el entorno Mono y descomprimir el paquete Boo de [1]. En primer lugar, se puede utilizar el compilador booc.exe, para compilar un script: mono bin/booc.exe -out:U hello.exe hello.boo El binario generado a partir del script hello.boo puede ejecutarse con el comando mono hello.exe. La opcin -r incluir cualquier DLL adicional que se necesite: mono bin/booc.exe -r:U gtk-sharp -out:hellogtk.exe U hellogtk.boo Cuando se distribuyan programas como este habr que incluir la librera Boo.Lang.dll del directorio bin con el paquete de distribucin. Adems del compilador de Boo, el paquete tambin incluye el intrprete booi.exe, que puede ejecutar los scripts de Boo directamente, como mono bin/booi.exe hello.boo. Por otro lado, tambin disponemos de una shell interactiva booish.exe que soporta la entrada directa de comandos en un estilo similar a Python. Por ltimo, se puede utilizar la API de Boo para ejecutar el cdigo Boo. Los objetos Dotnet que proporciona la API incluso permitirn ejecutar un script de Boo dentro de otro (Listado 5).

Est bastante claro que b debe ser un nmero. De hecho, la primera lnea de este ejemplo es redundante, ya que el compilador posee toda la informacin que necesita a partir del 3. Los programadores slo tienen que declarar las variables explcitamente cuando la inferencia de tipos no vaya a funcionar. Listas, arrays y tablas hash son fciles de manejar. Para rellenar una lista, a, con los nmeros del 1 al 5, hay que crear un objeto lista:
a= List(range(1,5))

En este ejemplo se busca la cadena test en la variable ejemplo, donde la s entre la e y la t podra ser cualquier carcter. La expresin regular tiene que ir entre @/.../.

Funciones
Los fans de Python se sentirn como en casa con las definiciones de funciones:
def Hola(nombre as string): return Tu nombre: ${nombre} print Hola(Pepe)

Listado 2: Sintaxis de Bloque


01 02 03 04 05 06 07 08 09 10 def function(): a = 0 # new variable inc = { a+=1 } show = {return a} return inc, show i,s=function() print(s()) i() print(s())

Boo gestiona las funciones como objetos de primera clase, un concepto que surgi con los lenguajes de programacin funcionales. Las funciones soportan cualquier accin que sea soportada por el lenguaje de programacin, as se pueden almacenar en variables o pasarse como argumentos a otras funciones. Y, por supuesto, se pueden devolver como resultado:
def function1(item as int): return item // no hace nada def function2(): return function1

54

Nmero 26

WWW.LINUX- MAGAZINE.ES

Boo DESARROLLO

Listado 3: Generadores
01 def MyGenerator(): 02 i = 1 03 yield i 04 for x in range(10): 05 i += 2 06 yield i 07 08 print(List(MyGenerator()))

power espera una funcin cierre que, de hecho, devuelve una nueva funcin. Sin embargo, la funcin que produce tambin espera una entrada. De hecho podra llamarse a este do de la siguiente forma:
power(5)(2)

Listado 4: Propiedades
01 class Chair: 02 Color as string: 03 get: 04 return _color 05 set: 06 _color = value 07 08 _color as string 09 10 woodenchair = Chair() 11 woodenchair.Color = Brown

mos de ver, o la sintaxis basada en llaves, como se muestra en el Listado 2. En este caso, los cierres aparecen entre llaves, y su cdigo utiliza la variable a de la funcin que la engloba. Incluso se pueden invocar los cierres aunque el entorno, y por ello las variables, hayan dejado de existir.

Un Poco de Picante
Como Boo soporta el concepto de retorno de funciones, son posible expresiones como la siguiente:
power = { x as int | return U { y as int | return x ** y }} U // ** representa una potencia

Como se puede ver, el 5 se pasa primero a la funcin power, que devuelve una funcin (la funcin { y as int | return 5 ** y} para ser precisos). El 2 se pasa luego a la nueva funcin, que devuelve el resultado. La ltima lnea se entiende como que, en vez de tener una nica funcin con dos argumentos, se tienen dos funciones con un argumento cada una. Los arquitectos de software se refieren a esta tcnica como currying.

Generadores
Adems de los cierres, Boo tambin soporta generadores: funciones que producen una serie de resultados. Sin embargo, no simplemente generan y devuelven una lista completa, sino que el siguiente elemento de la lista no se

calcula a menos que sea realmente necesario. Boo se refiere a estas funciones como mtodos generadores (Listado 3). El generador MyGenerator se ejecuta hasta el siguiente yield, a continuacin extrae el valor de la variable que encuentra all y se para. Cuando la funcin que lo ha llamado (List en el ejemplo) necesite el siguiente valor, el generador continuar justo en el punto donde lo dej. Como el siguiente valor slo se genera si se necesita, esta solucin requiere menos memoria bajo condiciones ideales; despus de todo, un nico nmero ocupa

DESARROLLO Boo

Listado 5: Utilizacin de la API para ejecutar el cdigo Boo


01 02 03 04 05 06 import Boo.Lang.Compiler import Boo.Lang.Compiler.IO import Boo.Lang.Compiler.Pipelines

Los tipos dinmicos implican la desactivacin de la comprobacin de tipos esttica para las variables y con ello se consigue la potencia para asignar objetos arbitrarios a las variables:
d as pato // d puede ser deU cualquier tipo de aqu en U adelante d = 5 // d es un entero U a partir de aqu... d = Hola // ... y una U cadena desde aqu

compiler = BooCompiler() compiler.Parameters.Input.Add(StringInput(<script>, print(Hello!))) 07 compiler.Parameters.Pipeline = Run() 08 compiler.Run()

menos espacio que una lista completa. Esto es particularmente aparente en controles de iteracin, como en los bucles for. Adems de los mtodos generadores, Boo tambin cuenta con expresiones generadoras, que funcionan exactamente como sus homlogas funcionales, pero que comprenden un nico bucle for. Esto elimina la necesidad de definir explcitamente una funcin, proporcionando un soporte til para definiciones compactas de cantidades como todos los nmeros impares entre 1 y 10 multiplicados por 2:
uneventimestwo = i*2 for i U in range(10) if i%2 for x in uneventimestwo : print x

def Calculation(): for x in range(10): longcalculation(x) Calculation.BeginInvoke()

As que si grazna como un pato, anda como un pato y se parece a un pato, entonces lo trataremos como un pato (pato es la traduccin de duck).

Esto har llorar a ms de un programador de C. Nunca ha sido tan fcil la programacin multihebra.

Extensible
Boo se ha diseado como un lenguaje extensible. Por ejemplo, se pueden aadir macros personalizadas. Viene con diversas funciones de ayuda, como assert, que comprueba una condicin y lanza una excepcin si la condicin es falsa:
assert 1>5, Uno no es mayor que 5

Atributos y Campos
En un lenguaje orientado a objetos, cada objeto posee sus propios mtodos y atributos. Para acceder a los atributos, los programadores normalmente tienen que proporcionar un mtodo para establecer y otro para obtener los valores de los atributos. Esta tarea tan frecuente puede ser un incordio, as que Boo adopt la idea de las propiedades de C#. Boo distingue entre campos y propiedades, donde los campos son variables que implementan los atributos de un objeto y las propiedades son una alternativa sintctica interesante para los tpicos mtodos set y get (Listado 4). El acceso a Color se maneja intuitivamente con una simple asignacin. Entre bastidores, este ejemplo realmente llama al mtodo set y almacena el valor pasado en el campo _field. Todo esto sucede de forma transparente al usuario. Para ahorrar escritura, Boo incluso posee una abreviatura:
class Chair: [Property(Color)] _color as string

De nuevo, Boo slo produce el siguiente nmero despus de comprobar la condicin de terminacin en el segundo bucle for. Juntando una lista de expresiones generadoras se obtiene un generador de lista, una forma rpida de rellenar una lista con objetos seleccionados:
uneventimestwolist = U [i*2 for i in range(10) if i%2]

Detrs de la macro hay un simple objeto Dotnet que sigue una signatura especfica, as que Boo no se preocupa por el lenguaje en el que est escrita la macro. Pero hay algo ms que extensibilidad: el compilador de Boo ha sido diseado como un cauce modular. Si fuera necesario, se puede acceder al proceso de compilacin y realizar las acciones oportunas.

Conclusiones
Boo es un lenguaje de script de aprendizaje sencillo que adems produce binarios CLI de forma rpida, lo que lo hace un lenguaje muy adecuado para el desarrollo de prototipos y la integracin con Dotnet y Mono. Su proximidad sintctica a Python tambin facilita la vida a los programadores que deseen pasarse l. Actualmente se encuentra en proceso el soporte para I Dotnet 2.0.

Clases
Al contrario que C#, Boo puede, si es necesario, funcionar sin clases. Puede utilizarse programacin imperativa u optar por funciones, como en C. Sin embargo, sin que el usuario lo aprecie, es un lenguaje completamente orientado a objetos. Cualquier funcin puede ser considerara como un objeto. La funcin print(Hola Mundo) es lo mismo que print.Invoke(Hola Mundo). Y reemplazando .Invoke con .BeginInvoke, se ejecuta el cuerpo de la funcin en su propio hilo de ejecucin:

Boo genera automticamente los mtodos get y set requeridos sin que se vean.

Tipos Dinmicos
Boo toma el concepto de tipos dinmicos de Ruby (duck typing en ingls).

RECURSOS
[1] Sitio web de codehaus.org Boo:

http://boo.

56

Nmero 26

WWW.LINUX- MAGAZINE.ES

Você também pode gostar