Un langage dédié (DSL) est un petit langage optimisé pour un domaine précis. Parce qu'un DSL est ciblé, il peut grandement améliorer la productivité et la compréhension, en permettant à celui qui l'écrit de déclarer ce qu'il veut plutôt que comment y parvenir.
L'un des domaines où on les rencontre est celui des personnalisations et configurations complexes.
Par exemple, le langage DOT permet d'écrire une description textuelle d'un graphe, qui est ensuite transformée en image par l'un des outils Graphviz (comme dot).
Un graphe simple ressemble à ceci :
graph {
graph [bgcolor="yellow"]
a [color="red"]
b [color="blue"]
a -- b [color="green"]
}
Si on met ceci dans un fichier example.dot et qu'on exécute dot example.dot -T png -o example.png, on obtient une image example.png avec un cercle rouge et un cercle bleu reliés par une ligne verte sur un fond jaune.
Écris un langage dédié similaire au langage dot de Graphviz.
Notre DSL est similaire au langage dot de Graphviz en ce sens qu'il servira à créer des structures de données de graphe. Toutefois, contrairement au langage DOT, notre DSL sera un DSL interne, destiné à n'être utilisé que dans notre langage.
Pour en savoir plus sur la différence entre les DSL internes et externes.
Un graphe, dans ce DSL, est un objet de type Graph. Il prend une list d'un ou plusieurs tuples qui décrivent :
Nodes
Edges
Les implémentations d'un Node et d'un Edge sont fournies dans dot_dsl.py.
Pour plus de détails sur la conception attendue du DSL et sur les types d'erreurs et les messages d'erreur attendus, jette un œil aux cas de test dans dot_dsl_test.py
Il est parfois nécessaire de lever une exception. Quand tu le fais, tu dois toujours inclure un message d'erreur explicite pour indiquer quelle est la source de l'erreur. Cela rend le code plus lisible et facilite grandement le débogage. Dans les cas où tu sais que la source de l'erreur sera d'un certain type, tu peux choisir de lever l'un des types d'erreur intégrés, mais tu dois quand même inclure un message explicite.
Cet exercice en particulier demande que tu utilises l'instruction raise pour « lancer » un TypeError quand un Graph est mal formé, et un ValueError quand un Edge, un Node ou un attribute est mal formé. Les tests ne passeront que si tu lèves l'exception avec raise et que tu y ajoutes un message.
Pour lever une erreur avec un message, écris le message comme argument du type exception :
# Graph is malformed
raise TypeError("Graph data malformed")
# Edge has incorrect values
raise ValueError("EDGE malformed")
Inscris-toi sur Exercism pour apprendre et maîtriser Python avec 17 concepts146 exercices, et un vrai mentorat humain, le tout gratuitement.