Como já comentei, Boo é uma linguagem que tem como uma das caracteristicas mais marcantes sua extensibilidade.
A extensibilidade se dá na forma de macros e atributos sintaticos que modificam o código gerado no momento da compilação, e também em mudanças no próprio compilador, através do conceito de pipelines de compilação.
Para se entender melhor, quando você usa o compilador booc, o mesmo executa uma série de passos, que começa com o parsing do arquivo, execução das analises semanticas, transformações na AST e por fim geração do assembly (exe ou dll). Isso é o que é conhecido como pipeline padão de compilação.
O compilador booc já vem com várias outras pipelines definidas, e permite também que o programador defina outras.
Uma das pipelines bem interessantes que já vem com o compilador é a pipeline chamada boo, essa pipeline executa todo o processo de compilação normal, com todos os passos e todas as transformações que são aplicadas a AST e no final, invés de gerar um assembly, gera uma saida boo com todo o código que seria compilado para a criação do assembly.
Parece abstrato demais ? Vamos ao código então, o velho e bom Hello World.
-
print "Hello World"
Esse é um código mínimo em Boo que escreve a mensagem “Hello World” na tela, mas você pode se perguntar, esse não é um executavel .Net ? Cadê o static void Main… ?
Vamos usar a nossa nova conhecida, a pipeline boo, pra descobrir. Salve o programa no arquivo hello.boo e rode:
-
booc -p:boo hello.boo
E você terá:
-
[System.Runtime.CompilerServices.CompilerGlobalScopeAttribute]
-
public final transient class HelloModule(object):
-
private static def Main(argv as (string)) as void:
-
System.Console.WriteLine(‘Hello World’)
-
-
private def constructor():
-
super()
A saída mostra o código que seria compilado depois de todas as mágicas executadas pelo compilador.
Note o uso do parâmetro -p:boo, é ele que diz ao compilador pra usar a pipeline boo e não a padrão.
Um detalhe, a chamada a print virou um System.Console.WriteLine, porque print é uma macro que ao ser executada expande para a chamada equivalente WriteLine.
Isso é só uma pequena parte do que pode ser feito com as pipelines, de geração de código em outra linguagem, verificação de padrões de desenvolvimento, compilação em memória, code completing, as possibilidades são várias.
Please click here to download the plugin required to make recent comments work!