Boo é legal!

O .Net Architects faz dojos de vez em quando, e a ideia é fazer cada vez com uma linguagem diferente do .Net. Desta vez pegamos uma menos conhecida, sugestão minha, porque eu já tinha ouvido muito falar nela: Boo. O Boo foi criado pelo Rodrigo Bamboo, um brasileiro que conhece muito. Convidei o Rodrigo a participar de um painel de linguagens que aconteceu no TDC, onde também discutimos IronRuby, F#, IronPython, Ioke, entre outras linguagens que atendem o CLI. Ele mostrou muitas coisas legais, e fiquei curioso. O dojo foi a desculpa que faltava para eu estudar Boo.

Fizemos o dojo e ficou ótimo. Fizemos o jogo de boliche, e o resultado já está no BitBucket, basta ir lá e clonar o repositório. Basicamente desenvolvemos duas classes, a de teste, e a do jogo. Aqui está o resultado do trabalho, a classe de jogo:

 

Legal que o Bitbucket já suporta a colorização de arquivos Boo. Os testes estão aqui.

Quero trazer pra vocês minha visão sobre o que achei do Boo, e dá pra fazer isso em uma palavra: fantástico. Vou mostrar pra vocês neste post algumas coisas que gostei muito.

Vamos começar pelo mais fácil: você também pode experimentar o Boo de forma muito fácil: abra o Extension Manager do Visual Studio 2010 e baixe a extensão recém lançada que permite usar Boo no Visual Studio (clique para ampliar):

Novo projeto de Boo

Mande instalar e reinicie o Visual Studio. Pronto, você já tem o Boo na máquina. Você também pode baixar a extensão online e ver mais detalhes sobre ela aqui.

A extensão foi lançada no último dia 15, ou seja, não tem nem uma semana de vida, mas já funciona direitinho. Falta Intelisense, breakpoints, não tem GoToDefinition, não funciona o Resharper, e a colorização as vezes se perde, mas de resto funciona bem. Dá pra compilar e rodar testes sem precisar fazer tudo na linha de comando ou usando Ubuntu.

Após instalar, você terá dois novos projetos, um de Class Library e um de Console App, debaixo da categoria “Visual Boo” (que tem um nome bem engraçado):

Projetos de Boo

Como não há projeto de testes em Boo, criamos para o Dojo duas class libraries, e em uma referenciamos o NUnit. Rodamos os testes com TestDriven.Net, mas sempre no nível do projeto, ou seja, não dá pra rodar um método por vez, ou só uma classe, etc, etc… mas funcionou bem e rodou rápido.

Você vai ter todo o Boo instalado pra você junto com o plugin. Se quiser olhar, elas provavelmente estará em:

C:\Users\<usuario>\AppData\Local\Microsoft\VisualStudio\10.0\Extensions\Hill30\Visual Studio Boo plugin\0.5.0.3\Boo_files

 

Por lá você vai encontrar o compilador (booc.exe), e o mais legal de todos, o REPL, chamado de booish.exe. Rode ele, vai ver algo assim:

REPL - Booish

Ele é ainda mais legal que o REPL de C#, que vem com o Mono, porque podemos declarar tipos. Vejam:

Declarando tipos no Booish

Esse exemplo mostra várias outras coisas legais do Boo também. Algumas:

  • Os atributos sintáticos do Boo, como o [getter(Nome)] que ao ser atribuído a um campo cria o código de uma propriedade só com Getter, sem Setter.
  • Interpolação de strings no método FalaONome, algo muito útil
  • Limpeza da linguagem: nada ponto e vírgula, nada de precisar declarar variáveis, nada de “new” para criar objetos, nada de chaves. Temos uma linguagem limpa (herança do Python, que inspirou o Rodrigo).

Tem outra coisa muito legal, vejam o que acontece se eu tentar passar nulo no construtor:

DbC com Boo

Uma ArgumentNullException! Sim, Design By Contract é parte do Boo há bastante tempo, muito antes de aparecer no C# ou no VB.

E Boo ainda é uma linguagem estaticamente tipada. Não podemos ignorar os tipos:

Boo é estática

E funções são cidadãos de primeira importância. Podemos declarar funções independentes de classes:

Funções no REPL

Funções podem ser atribuidas a variáveis facilmente, nada de precisar de delegates:

Associando uma função a uma variável

E há um tipo de currying também, apesar de não ser tão simples quanto F#:

Currying com Boo

Isso tudo já seria muito legal, mas ainda há literais de listas:

Listas com Boo

E também de arrays… Veja o de dicionário:

Dicionário com Boo

Da forma que eu fiz parece um array, mas as chaves poderiam ser strings, datas, etc…

Além disso, ainda há as macros sintáticas, com checagem estática, muito poderosa. Boo pode ser extendida demais, você pode criar novas palavras chavas com as macros.

Isso sem falar no compilador, que também é extensível. Você pode colocar passos no meio da compilação.

Lembrando que Boo é uma linguagem .Net como qualquer outra, ou seja, gera IL e pode ser referenciada e referenciar qualquer outra linguagem que você estiver usando no .Net, e funciona perfeitamente no Visual Studio. Nada te impede de ter um projeto em C# ou VB que referencia um projeto em Boo na mesma solução.

Vejam o resultado da compilação do projeto no VS:

Resultado da compilação com Boo

E aqui aberto no Reflector, e traduzido pra C#:

Boo descompilado pra C#

Boo já tem suporte no Mono pra rodar via MonoDevelop, Veja rodando no Ubuntu (e já com projetos web):

Boo no Monodevelop do Ubuntu

Boo é open source, e seu código está no GitHub do Rodrigo Bamboo. Gostou de algo? Quer mudar? Quer ver como funciona? Pega lá: github-icon

Espero que gostem, vou continuar experimentando. Pra quem quiser ver o código do boliche, está tudo funcionando, faltou só terminar o jogo, com a décima rodada, que é a que permite uma jogada extra. Tente terminar, veja o que acha. Depois me conta aqui.