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.
In questo esercizio sei completamente libero di progettare il DSL per grafi dei tuoi sogni.
Forse ti piacerebbe creare un DSL basato su liste di tag e record, come questo:
my_graph =
Graph.create([
Title("My Graph"),
Node("a", { color: Green }),
Node("b", { color: Blue }),
Edge("a", "b", { style: Dotted }),
])
O forse preferiresti un DSL basato su catene di chiamate di funzione, come questo:
my_graph =
Graph.create()
.with_title("My Graph")
.add_node("a", Attr.create().with_color(Green))
...
O magari hai in mente un piano del tutto diverso? Fai pure! I test richiedono solo di creare alcuni grafi specifici: il modo in cui li costruisci dipende completamente da te.
Detto questo, un DSL di solito è migliore se è chiaro, conciso e non troppo sorprendente (ad esempio, la funzione minus serve per sottrarre, non per costruire un arco tra due nodi, come in node("a") - node("b")).
Per raddoppiare il divertimento, puoi provare, se vuoi, a implementare una funzione to_dot che converte il tuo grafo nel formato DOT!
Iscriviti a Exercism per imparare e padroneggiare Roc con 126 esercizi e il mentoring di persone reali, tutto gratis.