Un linguaggio specifico di dominio (DSL) è un piccolo linguaggio ottimizzato per uno specifico dominio. Dato che un DSL è mirato a uno scopo preciso, può avere un grande impatto sulla produttività e sulla comprensione, permettendo a chi scrive di dichiarare cosa vuole anziché come.
Uno degli ambiti in cui vengono applicati sono le personalizzazioni e le configurazioni complesse.
Per esempio, il linguaggio DOT permette di scrivere una descrizione testuale di un grafo che viene poi trasformata in un'immagine da uno degli strumenti Graphviz (come dot).
Un grafo semplice si presenta così:
graph {
graph [bgcolor="yellow"]
a [color="red"]
b [color="blue"]
a -- b [color="green"]
}
Se metti questo contenuto in un file example.dot ed esegui dot example.dot -T png -o example.png, ottieni un'immagine example.png con un cerchio rosso e uno blu collegati da una linea verde su uno sfondo giallo.
Scrivi un linguaggio specifico di dominio simile al linguaggio dot di Graphviz.
Il nostro DSL è simile al linguaggio dot di Graphviz nel senso che verrà usato per creare strutture dati a grafo. Tuttavia, a differenza del linguaggio DOT, il nostro DSL sarà un DSL interno, da utilizzare solo nel nostro linguaggio.
Scopri di più sulla differenza tra DSL interni ed esterni.
Un grafo, in questo DSL, è un oggetto di tipo Graph. Accetta una list di una o più tuple che descrivono:
NodesEdgesLe implementazioni di un Node e di un Edge sono fornite in dot_dsl.py.
Per maggiori dettagli sul design previsto del DSL e sui tipi di errore e i messaggi previsti, dai un'occhiata ai casi di test in dot_dsl_test.py
A volte è necessario sollevare un'eccezione. Quando lo fai, dovresti sempre includere un messaggio di errore significativo per indicare qual è l'origine dell'errore. Questo rende il codice più leggibile e aiuta molto con il debug. Nelle situazioni in cui sai che l'origine dell'errore sarà di un certo tipo, puoi scegliere di sollevare uno dei tipi di errore predefiniti, ma dovresti comunque includere un messaggio significativo.
Questo esercizio in particolare richiede di usare l'istruzione raise per «lanciare» un TypeError quando un Graph è malformato, e un ValueError quando un Edge, un Node o un attribute è malformato. I test passeranno solo se sollevi l'exception con raise e includi un messaggio con essa.
Per sollevare un errore con un messaggio, scrivi il messaggio come argomento al tipo exception:
# Graph is malformed
raise TypeError("Graph data malformed")
# Edge has incorrect values
raise ValueError("EDGE malformed")
Iscriviti a Exercism per imparare e padroneggiare Python con 17 concetti146 esercizi e il mentoring di persone reali, tutto gratis.