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.
Um grafo, nesta DSL, é um objeto do tipo Graph. Ele recebe uma list de uma
ou mais tuplas que descrevem:
NodesEdgesAs implementações de um Node e de uma Edge estão em dot_dsl.py.
Para mais detalhes sobre o design esperado da DSL e sobre os tipos de erro e as mensagens esperados, dê uma olhada nos casos de teste em dot_dsl_test.py
Às vezes é necessário levantar uma exceção. Quando você faz isso, inclua sempre uma mensagem de erro significativa para indicar qual é a origem do erro. Isso deixa seu código mais legível e ajuda bastante na depuração. Quando você sabe que a origem do erro será de um tipo específico, pode escolher levantar um dos tipos de erro internos, mas ainda assim deve incluir uma mensagem significativa.
Este exercício em particular exige que você use a instrução raise para "lançar" um TypeError quando um Graph estiver malformado, e um ValueError quando um Edge, um Node ou um attribute estiver malformado. Os testes só vão passar se você usar raise na exception e incluir uma mensagem com ela.
Para levantar um erro com uma mensagem, escreva a mensagem como argumento do tipo da exception:
# Graph is malformed
raise TypeError("Graph data malformed")
# Edge has incorrect values
raise ValueError("EDGE malformed")
Crie sua conta no Exercism para aprender e dominar Python com 17 conceitos146 exercícios e mentoria humana de verdade, tudo de graça.