Uma linguagem específica de domínio (DSL) é uma linguagem pequena, otimizada para um domínio específico. Como uma DSL é direcionada a um domínio, ela pode aumentar muito a produtividade e a compreensão, pois permite que quem escreve declare o que quer, em vez de como.
Uma das áreas em que elas são aplicadas é a de customizações e configurações complexas.
Por exemplo, a linguagem DOT permite escrever uma descrição textual de um grafo, que depois é transformada em uma imagem por uma das ferramentas do Graphviz (como o dot).
Um grafo simples se parece com isto:
graph {
graph [bgcolor="yellow"]
a [color="red"]
b [color="blue"]
a -- b [color="green"]
}
Colocando isso em um arquivo example.dot e rodando dot example.dot -T png -o example.png, você cria uma imagem example.png com um círculo vermelho e um azul ligados por uma linha verde sobre um fundo amarelo.
Escreva uma linguagem específica de domínio parecida com a linguagem dot do Graphviz.
Nossa DSL é parecida com a linguagem dot do Graphviz no sentido de que será usada para criar estruturas de dados de grafo. No entanto, ao contrário da linguagem DOT, nossa DSL será uma DSL interna, para uso apenas na nossa linguagem.
Saiba mais sobre a diferença entre DSLs internas e externas.
Neste exercício, você tem total liberdade para projetar a DSL de grafo dos seus sonhos.
Talvez você queira criar uma DSL baseada em listas de tags e registros, assim:
my_graph =
Graph.create([
Title("My Graph"),
Node("a", { color: Green }),
Node("b", { color: Blue }),
Edge("a", "b", { style: Dotted }),
])
Ou talvez você prefira uma DSL baseada em cadeias de chamadas de funções, assim:
my_graph =
Graph.create()
.with_title("My Graph")
.add_node("a", Attr.create().with_color(Green))
...
Ou talvez você tenha um plano bem diferente? Vá em frente! Os testes exigem apenas que você crie alguns grafos específicos. A forma de construí-los é totalmente com você.
Dito isso, uma DSL costuma ser melhor quando é clara, concisa e não muito surpreendente (por exemplo, a função minus serve para subtrair, não para criar uma aresta entre dois nós, como em node("a") - node("b")).
Para dobrar a diversão, você pode, opcionalmente, tentar implementar uma função to_dot que converte seu grafo para o formato DOT!
Crie sua conta no Exercism para aprender e dominar Roc com 126 exercícios e mentoria humana de verdade, tudo de graça.