Eine domänenspezifische Sprache (DSL) ist eine kleine Sprache, die auf einen bestimmten Bereich zugeschnitten ist. Da eine DSL auf einen bestimmten Zweck ausgerichtet ist, kann sie Produktivität und Verständnis stark verbessern: Du beschreibst was du willst, statt wie.
Ein Problembereich, in dem sie eingesetzt werden, sind komplexe Anpassungen und Konfigurationen.
Zum Beispiel erlaubt dir die DOT-Sprache, eine Textbeschreibung eines Graphen zu schreiben, die dann von einem der Graphviz-Tools (wie dot) in ein Bild umgewandelt wird.
Ein einfacher Graph sieht so aus:
graph {
graph [bgcolor="yellow"]
a [color="red"]
b [color="blue"]
a -- b [color="green"]
}
Wenn du das in eine Datei example.dot schreibst und dot example.dot -T png -o example.png ausführst, entsteht ein Bild example.png: ein roter und ein blauer Kreis, die durch eine grüne Linie auf gelbem Hintergrund verbunden sind.
Schreibe eine domänenspezifische Sprache, die der Graphviz-DOT-Sprache ähnelt.
Unsere DSL ähnelt der Graphviz-DOT-Sprache insofern, als sie zur Erstellung von Graph-Datenstrukturen verwendet wird. Anders als die DOT-Sprache ist unsere DSL jedoch eine interne DSL, die nur in unserer Programmiersprache verwendet wird.
Erfahre mehr über den Unterschied zwischen internen und externen DSLs.
In dieser Übung kannst du die Graph-DSL deiner Träume völlig frei entwerfen.
Vielleicht möchtest du eine DSL erstellen, die auf Listen von Tags und Records basiert, etwa so:
my_graph =
Graph.create([
Title("My Graph"),
Node("a", { color: Green }),
Node("b", { color: Blue }),
Edge("a", "b", { style: Dotted }),
])
Oder vielleicht bevorzugst du eine DSL, die auf Ketten von Funktionsaufrufen basiert, etwa so:
my_graph =
Graph.create()
.with_title("My Graph")
.add_node("a", Attr.create().with_color(Green))
...
Oder hast du einen ganz anderen Plan? Nur zu! Die Tests verlangen nur, dass du ein paar bestimmte Graphen erstellst. Wie du sie aufbaust, bleibt völlig dir überlassen.
Trotzdem ist eine DSL meist besser, wenn sie klar, knapp und nicht allzu überraschend ist (z. B. ist die Funktion minus zum Subtrahieren gedacht und nicht dafür, eine Kante zwischen zwei Knoten zu bauen, wie in node("a") - node("b")).
Um den Spaß zu verdoppeln, kannst du optional versuchen, eine Funktion to_dot zu implementieren, die deinen Graphen ins DOT-Format umwandelt!
Melde dich bei Exercism an, um Roc mit 126 Übungen und echtem menschlichen Mentoring zu lernen und zu meistern, alles kostenlos.