JavaFree.org | RubyOnBr.org

DSL para Winamp

Acompanhar DSL para Winamp 4 posts, 4 participantes

Avatar Daniel Gatis 158 posts

A alguns dias atras li alguns artigos (esse, e esse outro) sobre DSL em ruby e fiquei altamente instigado para fazer uma DSL.

Não quero entrar em detalhes do que é ou não é uma DSL pois esse assunto é muito subjetivo. Ideial par se levar para mesa de um bar. (dependendo da compainha logico!) =)

O que você tem que saber é que se estou escrevendo essa linguagem para um fim e se você a usa com essa finalidade isso é uma DSL. Agora se você consegue usar, usando alguma esperteza, para outros fins isso não é uma DSL para você.

Vamos escrever uma DSL para meu irmão (pudim, o pelidiozinho! hehehe) fazer programas para controlar o winamp com as musicas dele (swinguera da bahia!). Já fiz algo parecido em java (aqui) mas concerteza vai ficar muito dificil para ele usar. Então vamos fazer uma DSL para ele =)

Primeiro precisamos escrever como seria uma DSL facil para ele usar. Pensei em algo do tipo:

Bem acho que meu irmão consegue entender isso! Mas perai… temos um problema! Precisamos fazer isso ficar com a cara de ruby do jeito que tá a sintaxe não encaixa. Vamos ajeitar para:

Bem agora isso ta com cara de ruby! Então vamos colocar isso em um arquivo para que nossa DSL possa parsear isso.

winamp.scr

Agora vamos começar a fazer nossa DSL. Vamos pirmeiro nos preucupar com o parse e criar metodos burros que apenas imprimem o que irão fazer.

dsl.rb

Ao rodar isso vamos ter como saida:


vou rodar os comandos de proc: #<Proc:0×027f59fc@./winamp.src:1>

Agora vamos implementar a classe que vai se comunicar com o winamp:

dsl.rb

Agora fazemos no prompt de comando:
ruby dsl.rb

Opa! já vemos nossa DSL em acão!

Agora vamos ser um pouco DRY e refatorar um pouco. Você deve ter percebido que repitimos muito essas chamdas de api do windows. Vamos enxugar isso e criar metodos privados para realizar essas chamadas.

dsl.rb

Legal! Mas ainda não é suficiente estamos repitindo muito o “if” que verifica se o handle não é nulo em cada metodo da classe. Vamos mudar isso tambem.

dsl.rb

Agora podemos retirar aquela chamada estatica ao “winamp.src” e passar isso por paramentro na linha de comando tambem podemos colocar constantes nos codigos de mensagens do winamp.

E nosso resultado final é algo do tipo:

dsl.rb

winamp.src

para funcionar:
ruby dls.rb winamp.src

ps: só lembrando o winamp tem que ta aberto =)

=*

 
Avatar Ronie Uliana 891 posts

DUCA!!!!

Tremendo material LEGAL!!!

(Nota mental: Fazer um esquema pra destacar tópicos desse tipo! Urgente!)

 
Avatar Bruno Santos 11 posts

O Daniel pudia publicar isso como artigo!!!

 
Eu2 Carlos Eduardo 266 posts

Puts grila, Macacos me mordam…. Tá pintando uma galera fera por aqui heim ?

Parabéns Daniel!!!