Lenon Marcel meu blog sobre qualquer coisa

Exemplo de DSL com Ruby - O amor

DSL (Domain-specific language) é o nome dado a prática de se criar uma linguagem para resolver problemas específicos.

Um bom exemplo de uso de DSL é o Sinatra, usado para criar aplicações web rapidamente e com o mínimo de esforço:

get "/" do
  "hello"
end

post "/foo" do
  "foo"
end

O Ruby é perfeito para criar _DSL_s. Por exemplo, eu quero gerar um XML de um post:

<?xml?>
<post>
    <title>titulo do post</title>
    <content>conteudo do post</content>
</post>

A implementação da minha DSL ficaria assim:

class Post
  def initialize(&block)
    @title = ""
    @content = ""
    instance_eval(&block)
  end

  def title(str)
    @title = str
  end

  def content(str)
    @content = str
  end

  def to_s
    <<-END
    <?xml?>
    <post>
        <title>#{@title}</title>
        <content>#{@content}</content>
    </post>
    END
  end
end

def post(&block)
  Post.new(&block)
end

Simples, huh? Agora, para gerar o XML, posso usar minha DSL:

post do
  title "Hello, is it me you're looking for?"
  content <<-TEXT
    I can see it in your eyes
    I can see it in your smile...
  TEXT

  puts to_s
end

CC0 Este artigo está em domínio público.