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 DSLs. 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