DOT DSL

DOT DSL

Közepes

Utasítások

A tartományspecifikus nyelv (DSL) egy adott területre optimalizált kis nyelv. Mivel a DSL célzott, nagyban növelheti a termelékenységet és a megértést azzal, hogy az író azt deklarálhatja, amit szeretne, nem pedig azt, hogy hogyan.

Az egyik problématerület, ahol ezeket alkalmazzák, a bonyolult testreszabások és konfigurációk.

Például a DOT nyelv segítségével szövegesen leírhatsz egy gráfot, amelyet aztán a Graphviz egyik eszköze (például a dot) képpé alakít. Egy egyszerű gráf így néz ki:

graph {
    graph [bgcolor="yellow"]
    a [color="red"]
    b [color="blue"]
    a -- b [color="green"]
}

Ha ezt egy example.dot fájlba írod, és lefuttatod a dot example.dot -T png -o example.png parancsot, létrejön egy example.png kép, amelyen sárga háttéren egy piros és egy kék kör látható, zöld vonallal összekötve.

Írj egy tartományspecifikus nyelvet, amely hasonlít a Graphviz dot nyelvéhez.

A mi DSL-ünk abban hasonlít a Graphviz dot nyelvéhez, hogy gráf adatszerkezetek létrehozására fogjuk használni. A DOT nyelvvel ellentétben azonban a mi DSL-ünk belső DSL lesz, amelyet csak a saját nyelvünkben használunk.

Tudj meg többet a belső és a külső DSL közötti különbségről.

Építsd meg a saját DSL-ed

Ebben a feladatban teljesen szabadon megtervezheted a gráf-DSL-t, amelyről mindig is álmodtál.

Talán egy olyan DSL-t szeretnél létrehozni, amely címkék és rekordok listáira épül, valahogy így:

my_graph =
    Graph.create([
        Title("My Graph"),
        Node("a", { color: Green }),
        Node("b", { color: Blue }),
        Edge("a", "b", { style: Dotted }),
    ])

Vagy inkább a függvényhívások láncolatára épülő DSL-t részesítenéd előnyben, így:

my_graph =
    Graph.create()
        .with_title("My Graph")
        .add_node("a", Attr.create().with_color(Green))
        ...

Vagy esetleg egészen más terved van? Vágj bele! A tesztek csupán néhány konkrét gráf létrehozását kérik, azt viszont teljesen rád bízzák, hogyan építed fel őket.

Ugyanakkor a DSL általában akkor jobb, ha világos, tömör, és nem túl meglepő (pl. a minus függvény kivonásra való, nem pedig arra, hogy két csomópont közötti élt építs vele, mint a node("a") - node("b") esetében).

Hogy megduplázd a szórakozást, ha kedved tartja, megvalósíthatsz egy to_dot függvényt is, amely a gráfodat DOT formátumra alakítja!


Forrás

WikipediaA hivatkozás új ablakban vagy lapon nyílik meg
Szerkesztés GitHubon A hivatkozás új ablakban vagy lapon nyílik meg
Roc Exercism

Készen állsz elkezdeni a(z) DOT DSL feladatot?

Iratkozz fel az Exercism-re, hogy megtanuld és elsajátítsd a(z) Roc nyelvet 126 feladat segítségével, valódi emberi mentorálással, mindez ingyen.